使用自己的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

回到顶部