首頁 三十天.NET❤️Azure漸進式開發專案 輕量高效.NET Core開源Blog引擎:Miniblog.Core
首頁 三十天.NET❤️Azure漸進式開發專案 輕量高效.NET Core開源Blog引擎:Miniblog.Core
×

IT鐵人賽連結:https://ithelp.ithome.com.tw/articles/10206118

今天檢查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


留言


Comments are closed