n => n
... Что это будет делать?
Он просто отображает любое значение для себя. Это функция идентификации.
Почему бы просто не сказать OrderBy (n)?
Потому что n
не является переменной в области видимости - было бы неверным называть его таким. Это не лямбда-выражение, поэтому просто попытаться использовать n
как обычный аргумент метода.
Ваш код - это, просто пытающийся сказать «упорядочить эту последовательность по всему каждому элементу», а не проецировать каждый элемент на какое-то другое значение, но напрямую не говорить об этом.
OrderBy
требует проецирования от типа элемента к типу типа заказа - это просто, что в этом случае нам нужна проекция идентичности.
Вы можете написать свой собственный дополнительный метод расширения:
public static IEnumerable<T> OrderNaturally<T>(this IEnumerable<T> source)
{
return source.OrderBy(item => item);
}
А затем изменить оригинальное заявление:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderNaturally();
, если вы обнаружили, что более удобным для чтения.
В качестве альтернативы, вы можете создать Functions
класс с некоторыми полезными статических полей только для чтения:
public static class Functions<T>
{
public static readonly Func<T, T> Identity = x => x;
public static readonly Func<T, T> DefaultValue => x => default(T);
public static readonly Func<T, string> ToString = x => x == null ? null : x.ToString();
...
}
Тогда:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0)
.OrderBy(Functions<int>.Identity)
Я не думаю, что бы сделать это ... Я «Просто предлагаю подумать»
Предположим, что у вас есть функция 'int F (int x) {return x; } ', тогда вы можете использовать' .OrderBy (F) ' – I4V
На более мягком языке: вы должны указать OrderBy, какой ключ или свойство вы хотите использовать для сортировки. Пример MSDN: 'IEnumerable query = pets.OrderBy (pet => pet.Age);'. Высказывать OrderBy (Pet) не помогло бы, так как OrderBy не знает, как устроить Pet. –