2010-01-23 4 views
22

Предположим, у меня есть список объектов, и я хочу отсортировать их по элементам DateModified. Почему я не могу использовать такой делегат? Как я должен сортировать их по DateModified, если не как показано ниже:C#: Сортировка с анонимной функцией

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) => 
    { 
     return itemA.DateModified < itemB.DateModified; 
    })); 
} 
+2

Я предполагаю, что вы сократили функцию для демонстрационных целей? Потому что он должен возвращать строку, но ничего не возвращает. –

+0

Время, чтобы выбрать ответ mistah :) – Skurmedel

ответ

47

Почему бы не использовать выражение лямбда?

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 
+0

Определенно. Ответ Джеффа был * правильным *, но * yuck *. Лямбда настолько чище. – Aaronaught

+1

Одна маленькая записка, вы пропустили ' ':) – Skurmedel

+0

Skurmedel, спасибо, я отредактировал ответ. –

14

Если вы не хотите использовать лямбды или больше, чем .NET 2.0, используйте:

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(delegate(CartItem itemA, CartItem itemB) 
    { 
     return itemA.DateModified.CompareTo(itemB.DateModified); 
    }); 
} 

По моему опыту, в таких средах, как Unity, lambdas и даже делегаты могут вызывать сбои или проблемы, особенно на таких платформах, как iOS. В этом случае вы хотите сделать свой сортировщик отдельной функции следующим образом:

int SortCartItemFunction(CartItem itemA, CartItem itemB) 
{ 
    return itemA.DateModified.CompareTo(itemB.DateModified); 
} 

Тогда вы могли бы передать его на своем роде вызов, как это:

items.Sort(SortCartItemFunction); 
+0

1+, но предел голосования достиг :( – Skurmedel

0

bool не является полезным в таком делегате , обычно int используется, потому что вам нужны 3 значения для представления результатов сравнения, меньше, равно и больше. Сборники .NET обычно (если не всегда) принимают значение -1 меньше, 0 означает равное, а 1 означает больше.

В таком случае делегат должен проверить, меньше ли значение x, равно или больше значения y. Интересно отметить, что если вы переверните результаты, например, сравните y с x, вы будете сортировать в противоположном направлении.

Для облегчения сортировки дат, пожалуйста, проверьте JohnC's answer, или Sam's.

11

Sort метод принимает делегат под названием Comparison<T>. Вы пытаетесь передать в Func<int, int, bool>, который сам является делегатом. Нет конверсии между делегатом Func<int, int, bool> и делегатом Comparison<T>.

Вы можете, однако, использовать lambda expression.

items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 

В самом деле, вы используете это очень лямбда-выражение и передать его в конструктор Func<int, int, bool> *. Однако нет необходимости. Выражение лямбда может быть преобразовано в любые сопоставления подписи делегата, то есть (a, b) => a.DateModified.CompareTo(b.DateModified) может быть присвоено что-то напечатанное Func<int, int, int> или что-то введенное Comparison<T>. В этом случае мы передаем его тому, что ожидает Comparison<T>.

* С одной небольшой корректировкой. Сортировка ожидает целое число как возвращаемый тип. Отрицательные значения указывают меньше, 0 указывает равные, а положительные значения указывают больше.

Смежные вопросы