Ответ 1
Почему бы не использовать лямбда-выражение?
public string SortByDateModified(List<CartItem> items)
{
items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified));
}
Скажем, у меня есть список объектов, и я хочу отсортировать его по свойствам DateModified. Почему я не могу использовать такой делегат? Как я должен сортировать их по DateModified, если нет, как показано ниже:
public string SortByDateModified(List<CartItem> items)
{
items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) =>
{
return itemA.DateModified < itemB.DateModified;
}));
}
Почему бы не использовать лямбда-выражение?
public string SortByDateModified(List<CartItem> items)
{
items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified));
}
Если вы не хотите использовать 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);
Метод 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 указывает равные, а положительные значения указывают больше.
bool
не полезен для такого делегата, обычно используется int
, потому что вам нужны 3 значения для представления результатов сравнения, меньше, равно и больше. Обычно сборники .NET(если не всегда) принимают значение "-1" меньше, 0 означает "равно", а "1" означает больше.
Тогда вы в своем делетете должны проверить, меньше ли значение x, равно или больше значения y. Интересно отметить, что если вы переверните результаты, например, сравните y с x, вы будете сортировать в противоположном направлении.
Для упрощения сортировки дат выберите ответ JohnC или Sam's.