我有一个通用的
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)。
但是我的列表仍然以“错误”的方式排序。我错过了什么吗?我没有线索。
6条答案
按热度按时间6pp0gazn1#
你的比较器看起来不对。你仍然只是在默认的文本顺序中排序。当然你想解析这两个数字并基于此排序:
字符串
(Note这与您的问题不符,您的问题说明您已经调试并验证了Compare返回的值是正确的-但我担心我怀疑在这方面存在人为错误。)
此外,Sven是对的--改变
items
的值根本不会改变绑定列表。你应该添加:型
在你的方法的底部。
xesrikrc2#
我遇到了一般自然排序的问题,并在这里发表了解决方案:
Natural Sort Compare with Linq OrderBy()
字符串
34gzjxbg3#
我们能不能这样做:
字符串
使用方法:
型
这是相同的:
型
vof42yt14#
你可以使用Alphanum算法:
字符串
AlphanumComparator
型
8ljdwjyq5#
排序列表只绑定到局部变量items,而不是绑定列表的Items属性,因此它保持未排序。
[编辑]基本上,你只是简单地扔掉你的排序努力的结果;-)
cetgtptt6#
有一个Windows API:
字符串