【发布时间】:2009-06-12 08:49:48
【问题描述】:
我有一个通用的
List<MyClass>
其中MyClass 有一个属性InvoiceNumber,其中包含以下值:
200906/1
200906/2
..
200906/10
200906/11
200906/12
我的列表绑定到一个
BindingList<T>
支持linq排序:
protected override void ApplySortCore(
PropertyDescriptor property, ListSortDirection direction)
{
_sortProperty = property;
_sortDirection = direction;
var items = this.Items;
switch (direction)
{
case ListSortDirection.Ascending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
case ListSortDirection.Descending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
}
this.Items = items;
}
然而,默认的比较器排序(如假设的那样)如下:
200906/1
200906/10
200906/11
200906/12
200906/2
在这种情况下很糟糕。
现在我想用我自己的IComparer<T> 来处理这个。它看起来像这样:
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 String.Compare(stringA.ToString(), stringB.ToString());
if (valueA[0] == valueB[0])
{
return String.Compare(valueA[1], valueB[1]);
}
else
{
return String.Compare(valueA[0], valueB[0]);
}
}
}
并将ApplySortCore 代码更改为使用此IComparer:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
当我调试我的代码时,我看到MyComparer.Compare(object, object) 被多次调用并为比较方法返回正确的值(-1、0、1)。
但我的列表仍然以“错误”的方式排序。我错过了什么吗?我不知道。
【问题讨论】:
标签: c# linq sql-order-by icomparer