Подтвердить что ты не робот

С#: сортировка с анонимной функцией

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

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

Ответ 1

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

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

Ответ 2

Если вы не хотите использовать lambdas или больше, чем .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);

Ответ 3

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

Ответ 4

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

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

Для упрощения сортировки дат выберите ответ JohnC или Sam's.