今天檢查IT鐵人賽同步文章程式,發現忘記處理title排序會有問題。
舉例:1,2,10,3文章排序會變成1,10,2,3
可以使用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())
最後得到自訂義排序的結果: