iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 28

28.OrderBy自訂義排序,解決`1,2,10`標題排序會變成`1,10,2`問題

今天檢查IT鐵人賽同步文章程式,發現忘記處理title排序會有問題。
舉例:1,2,10,3文章排序會變成1,10,2,3
2018-10-28.22.15.19-image.png

可以使用OrderBy另外一個多載方法,建立比較類別實現 IComparer介面 自訂義排序:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer);

建立一個類別實作 IComparer 介面
1.使用正則抓出()裡面的數字值
2.實作Compare 比較方法,如果前者大於後者返回1整數,如果前者等於後者返回0整數,如果前者小於後者返回-1。藉此來比較大小作排序

//邏輯:
//	1.實作 `IComparer` 介面
public class PostTitleComparer : IComparer<string>
{
	//	2.使用正則抓出`()`裡面的數字值
	static int UseRegexGetTitleNumber(string text)
	{
		Match match = Regex.Match(text, @"(\d+)");
		if (match == null)
			return 0;
		int value;
		if (!int.TryParse(match.Value, out value))
			return 0;
		return value;
	}

	//	3.實作` Compare 比較方法`,如果前者大於後者返回1整數,如果前者等於後者返回0整數,如果前者小於後者返回 - 1。藉此來比較大小作排序。
	public int Compare(string s1, string s2)
	{
		var s1Val = UseRegexGetTitleNumber(s1);
		var s2Val = UseRegexGetTitleNumber(s2);
		if (s1Val > s2Val) return 1;
		if (s1Val < s2Val) return -1;
		if (s1Val == s2Val) return 0;
		return string.Compare(s1, s2, true);
	}
}

接著在OrderBy排序使用自訂義類別

排序集合物件.OrderBy(o => o.Title, new PostTitleComparer())

最後得到自訂義排序的結果:
2018-10-28.22.27.53-image.png


上一篇
27.使用UTC時間需要注意Kind問題
下一篇
29. 使用 IHostedService + Timer 建立.NET Core排程器
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30

尚未有邦友留言

立即登入留言