Tôi có một genericSử dụng IComparer riêng <T> với LINQ OrderBy
List<MyClass>
nơi MyClass
có một tài sản InvoiceNumber
trong đó có giá trị như:
200906/1
200906/2
..
200906/10
200906/11
200906/12
Danh sách của tôi bị ràng buộc vào một
BindingList<T>
mà hỗ trợ sắp xếp với 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;
}
Tuy nhiên, các loại Comparer mặc định (như vụ) như thế này:
200906/1
200906/10
200906/11
200906/1 2
200906/2
điều khó chịu trong trường hợp này.
Bây giờ tôi muốn sử dụng riêng của mình IComparer<T>
với điều này. Nó trông giống như thế này:
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]);
}
}
}
và thay đổi ApplySortCore
mã để sử dụng này IComparer
:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
Khi tôi gỡ lỗi mã của tôi, tôi thấy rằng MyComparer.Compare(object, object)
được gọi là nhiều lần và trả về giá trị đúng (- 1, 0, 1) cho một phương pháp so sánh.
Nhưng danh sách của tôi vẫn được sắp xếp theo cách "sai". Tui bỏ lỡ điều gì vậy? Tôi không có đầu mối.
Xin lỗi, tôi rút ngắn đáng mã một chút. Trong mã ban đầu của tôi tôi làm this.Items = items; (Nếu không nó sẽ không sắp xếp anyway) Nhưng int chuyển đổi hoạt động (tôi phải có được mù | | ngu ngốc để bỏ lỡ điều đó). Thx rất nhiều. –