問題:
您有一個物件列表,其屬性包含特定字串格式的發票編號,例如200906/1。 C# 中 Linq OrderBy 的預設排序會導致排序順序不理想,例如 200906/1、200906/10、200906/11。
解決方案:
To實作您自己的自訂排序順序,您可以定義一個IComparer
public class MyComparer : IComparer<Object> { public int Compare(Object stringA, Object stringB) { string[] valueA = stringA.ToString().Split('/'); string[] valueB = stringB.ToString().Split('/'); if (valueA.Length != 2 || valueB.Length != 2) { return stringA.ToString().CompareTo(stringB.ToString()); } // Parse numbers for comparison int numA = int.Parse(valueA[0]); int numB = int.Parse(valueB[0]); if (numA == numB) { return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1])); } else { return numA.CompareTo(numB); } } }
在原始程式碼中,您嘗試在 Linq OrderBy 中使用 MyComparer,如下所示:
items = items.OrderByDescending( x => property.GetValue(x), comparer).ToList();
此方法不正確。使用比較器的正確語法是:
items = items.OrderBy(x => property.GetValue(x), comparer).ToList();
請注意,如果您希望按升序排序,則使用 OrderBy 方法而不是 OrderByDescending。
最後,不要忘記將排序後的項目分配回您的資料來源以反映 UI 中的變更:
this.Items = items;
以上是如何使用自訂 IComparer 正確排序 LINQ OrderBy 中的物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!