使用自己的IComparer 与Linq OrderBy
我有一个通用的
List<MyClass>
where 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)被多次调用,并为compare方法返回正确的值(-1、0、1)。
但是我的清单仍然按照“错误”的方式排序。我想念什么吗?我没有任何线索。
回答:
您的比较者在我看来错了。您仍然只是按照默认的文本顺序进行排序。当然,您想解析两个数字并基于此进行排序:
public int Compare(Object stringA, Object stringB){
string[] valueA = stringA.ToString().Split('/');
string[] valueB = stringB.ToString().Split('/');
if (valueA.Length != 2 || valueB.Length != 2)
{
stringA.ToString().CompareTo(stringB.ToString());
}
// Note: do error checking and consider i18n issues too :)
if (valueA[0] == valueB[0])
{
return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1]));
}
else
{
return int.Parse(valueA[0]).CompareTo(int.Parse(valueB[0]));
}
}
(请注意,这与您提出的问题相符,表明您已调试并验证Compare是否返回了正确的值-但恐怕我怀疑这方面存在人为错误。)
此外,Sven的权利-更改的值items
根本不会更改绑定列表。您应该添加:
this.Items = items;
在您的方法的底部。
以上是 使用自己的IComparer 与Linq OrderBy 的全部内容, 来源链接: utcz.com/qa/410199.html