我有一個通用的使用自己的IComparer <T>使用LINQ的OrderBy
List<MyClass>
其中MyClass
具有包含值如屬性InvoiceNumber
:
一分之二十零萬零九百零六
二分之二十零萬零九百零六
..
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/10
200906/11
200906/1 2
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)用於比較方法。
但我的名單仍然排序「錯誤」的方式。我錯過了什麼嗎?我沒有任何線索。
對不起,我shortend代碼一點。在我原來的代碼中,我做this.Items =項目; (如果沒有,它不會排序)但int轉換的作品(我一定是盲目的||愚蠢的錯過了)。 Thx非常。 – 2009-06-12 11:06:15