MSDN дает этот пример кода в статье об Универсальном Делегате Func:
Func predicate = ( str, index) => str.Length == index;
String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
IEnumerable aWords = words.Where(predicate).Select(str => str);
foreach (String word in aWords)
Console.WriteLine(word);
Я понимаю то, что все это делает. То, что я не понимаю,
Select(str => str)
бит. Конечно, это не нужно? Если Вы пропускаете его и просто имеете
IEnumerable aWords = words.Where(predicate);
затем Вы все еще получаете IEnumerable назад, который содержит те же результаты, и код печатает то же самое.
Я пропускаю что-то, или пример вводит в заблуждение?
Select
действительно избыточен.
Я подозреваю, что этот пример мог быть «переведен» из синтаксиса понимания запроса, например:
IEnumerable<String> aWords =
from w in words
where (...)
select w;
При использовании этого синтаксиса вы должны до выбрать
в конце , так работает компилятор. Однако при использовании метода расширения Where
в этом нет необходимости, если только вам действительно не нужно делать отдельную проекцию.
А может, это просто ошибка. Авторы MSDN не безупречны!
Действительно, в этом нет необходимости, внизу страницы msdn есть кнопка обратной связи. Скажите им, что .Select не нужен. Тот факт, что предложение Select просто:
Select(str => str)
Оно получает строку и выводит ту же строку
У вас там очень странная ссылка.Этого раздела нет в оглавлении, и он имеет следующее вверху:
«[Этот раздел является предварительной документацией и может быть изменен в будущих выпусках. Пустые разделы включены в качестве заполнителей.]»
Первая строка также выглядит как комментарий автора к самому себе.
И поскольку VS 2010 и .NET 4.0 только что вышли, я думаю, это какая-то неработающая тема, которая не была удалена / заменена вовремя.
Я думаю, теперь правильный URL для этого контента: http://msdn.microsoft.com/en-us/library/bb534303.aspx
Кстати, как вы получили свой URL? Это было через поиск MSDN или что-то еще?
Нет, это не нужно.
Такую конструкцию можно использовать, если вы хотите принудительно выполнять ленивое вычисление последовательности, т.е. чтобы предотвратить приведение типов. Если у вас есть метод, который возвращает List
, но объявляет возвращаемый тип IEnumerable
, тогда клиент может привести тип возвращаемого значения и напрямую управлять базовым списком. Очевидно, что это очень плохая идея, но класс мог бы защитить свое состояние, применив выбор идентичности, такой как тот, который используется в этом примере:
public IEnumerable<T> Items
{
get { return privateList.Select(i => i); }
}