C #: сортировка с анонимной функцией - PullRequest
24 голосов
/ 23 января 2010

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

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

Ответы [ 4 ]

53 голосов
/ 23 января 2010

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

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 
15 голосов
/ 23 января 2010

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

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

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

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

Тогда вы могли бы передать его вашему вызову сортировки следующим образом:

items.Sort(SortCartItemFunction);
11 голосов
/ 23 января 2010

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

нет преобразования.

Однако вы можете использовать лямбда-выражение .

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 обозначает равные, а положительные значения указывают больше чем.

0 голосов
/ 23 января 2010

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

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

Чтобы упростить сортировку дат, проверьте Ответ JohnC или Sam's .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...