问题:
您有一个对象列表,其属性包含特定字符串格式的发票编号,例如 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中文网其他相关文章!