Почему делает этот пример MSDN для Func <>, у делегата есть лишний Выбор () вызов?

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 назад, который содержит те же результаты, и код печатает то же самое.

Я пропускаю что-то, или пример вводит в заблуждение?

5
задан TarkaDaal 25 April 2010 в 15:04
поделиться

4 ответа

Select действительно избыточен.

Я подозреваю, что этот пример мог быть «переведен» из синтаксиса понимания запроса, например:

IEnumerable<String> aWords = 
    from w in words
    where (...)
    select w;

При использовании этого синтаксиса вы должны до выбрать в конце , так работает компилятор. Однако при использовании метода расширения Where в этом нет необходимости, если только вам действительно не нужно делать отдельную проекцию.

А может, это просто ошибка. Авторы MSDN не безупречны!

9
ответ дан 13 December 2019 в 22:04
поделиться

Действительно, в этом нет необходимости, внизу страницы msdn есть кнопка обратной связи. Скажите им, что .Select не нужен. Тот факт, что предложение Select просто:

Select(str => str)

Оно получает строку и выводит ту же строку

0
ответ дан 13 December 2019 в 22:04
поделиться

У вас там очень странная ссылка.Этого раздела нет в оглавлении, и он имеет следующее вверху:

«[Этот раздел является предварительной документацией и может быть изменен в будущих выпусках. Пустые разделы включены в качестве заполнителей.]»

Первая строка также выглядит как комментарий автора к самому себе.

И поскольку VS 2010 и .NET 4.0 только что вышли, я думаю, это какая-то неработающая тема, которая не была удалена / заменена вовремя.

Я думаю, теперь правильный URL для этого контента: http://msdn.microsoft.com/en-us/library/bb534303.aspx

Кстати, как вы получили свой URL? Это было через поиск MSDN или что-то еще?

0
ответ дан 13 December 2019 в 22:04
поделиться

Нет, это не нужно.

Такую конструкцию можно использовать, если вы хотите принудительно выполнять ленивое вычисление последовательности, т.е. чтобы предотвратить приведение типов. Если у вас есть метод, который возвращает List , но объявляет возвращаемый тип IEnumerable , тогда клиент может привести тип возвращаемого значения и напрямую управлять базовым списком. Очевидно, что это очень плохая идея, но класс мог бы защитить свое состояние, применив выбор идентичности, такой как тот, который используется в этом примере:

public IEnumerable<T> Items
{
   get { return privateList.Select(i => i); }
}
1
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: