Используйте собственный IComparer с Linq OrderByC#

Место общения программистов C#
Ответить
Anonymous
 Используйте собственный IComparer с Linq OrderBy

Сообщение Anonymous »

У меня есть общий
где MyClass имеет свойство InvoiceNumber, которое содержит такие значения, как:

200906/1

200906/2

..

200906/10

200906/11

200906/12


Мой список привязан к

Код: Выделить всё

BindingList
который поддерживает сортировку с помощью 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. Выглядит это так:

Код: Выделить всё

public class MyComparer : IComparer
{

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) для метода сравнения.

Но мой список по-прежнему отсортирован «неправильным» способом. Я что-то упускаю? Понятия не имею.

Подробнее здесь: https://stackoverflow.com/questions/985 ... nq-orderby
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»