gpt4 book ai didi

c# - 将自己的 IComparer 与 Linq OrderBy 结合使用

转载 作者:IT王子 更新时间:2023-10-29 04:11:20 26 4
gpt4 key购买 nike

我有一个通用的

List<MyClass>

哪里MyClass有一个属性InvoiceNumber其中包含以下值:

200906/1
200906/2
..
200906/10
200906/11
200906/12

我的列表绑定(bind)到一个

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)。

但我的列表仍然以“错误”方式排序。我错过了什么吗?我不知道。

最佳答案

我觉得你的比较器不对。您仍然只是按照默认的文本顺序进行排序。当然,您想要解析这两个数字并基于此进行排序:

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 的值根本不会更改您的绑定(bind)列表。你应该添加:

this.Items = items;

在你的方法的底部。

关于c# - 将自己的 IComparer<T> 与 Linq OrderBy 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/985657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com