Почему в этом примере MSDN для делегата Func <> есть лишний вызов Select ()? - PullRequest
5 голосов
/ 25 апреля 2010

MSDN приводит этот пример кода в статье об универсальном делегате Func :

Func<String, int, bool> predicate = ( str, index) => str.Length == index;

String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
IEnumerable<String> aWords = words.Where(predicate).Select(str => str);

foreach (String word in aWords)
    Console.WriteLine(word);

Я понимаю, что все это делает. Что я не понимаю, так это

Select(str => str)

немного. Конечно, это не нужно? Если вы оставите это и просто наберете

IEnumerable<String> aWords = words.Where(predicate);

тогда вы по-прежнему получаете обратно IEnumerable, который содержит те же результаты, и код печатает то же самое.

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

Ответы [ 4 ]

9 голосов
/ 25 апреля 2010

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

Я подозреваю, что этот пример, возможно, был "переведен" из синтаксиса понимания запросов, например:

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

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

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

1 голос
/ 25 апреля 2010

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

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

public IEnumerable<T> Items
{
   get { return privateList.Select(i => i); }
}
0 голосов
/ 27 апреля 2010

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

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

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

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

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

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

0 голосов
/ 25 апреля 2010

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

Select(str => str)

Получает строку и выводит такую ​​же строку

...