2009-09-25 4 views
20

Каковы преимущества/недостатки обоих подходов?доходность доходности от возврата

return items.Select(item => DoSomething(item)); 

против

foreach(var item in items) 
{ 
    yield return DoSomething(item); 
} 

EDIT Поскольку они MSIL примерно эквивалентны, какой из них вы найдете более удобным для чтения?

+11

Ваш второй фрагмент кода - это * реализация * для выбора. (Предполагая, что это LINQ to Objects.) Вот и все. Select делает - он запускает цикл foreach, запускает делегат для каждого элемента и дает результаты. –

+0

yep. Но при наборе первого и второго различий все еще есть различия. 1-я разница: количество LOC, вторая разница: читаемость, 3-я разница: когда доходность возврата присутствует в методе, применяются некоторые ограничения (т. Е. Вы не можете поставить выбор возврата после возврата доходности тем же методом). –

ответ

17

Метод yield return заставляет компилятор C# генерировать класс перечислителя «за кулисами», а вызов Select использует стандартный класс перечислителя, параметризованный делегатом. На практике для делегата не должно быть большой разницы между ними, кроме, возможно, дополнительного кадра вызова в случае Select.

Для чего это необходимо, обертывание лямбда вокруг DoSomething также не имеет смысла; просто передайте делегат для него напрямую.

+1

Что будет отличаться от передачи делегата, в отличие от лямбда, в данном случае? –

+9

return items.Select (DoSomething); –

+0

Ах, вот так, не думал об этом. –

3

Выбрать только позволяет возвращать один объект для каждого элемента в вашей коллекции «предметы». Использование дополнительного .Where(x => DoIReallyWantThis(x)) позволяет вам отсеять нежелательные элементы, но при этом позволяет вам возвращать только один объект за элемент. Если вы хотите потенциально более одного объекта на один элемент, вы можете использовать .SelectMany, но легко завершить его с помощью одной длинной строки, которая будет менее легкой для чтения.

«yield return» имеет возможность сделать ваш код более удобочитаемым, если вы просматриваете сложную структуру данных и выбирая биты информации здесь и там. Лучший пример этого, который я видел, был там, где было около дюжины отдельных условий, которые привели бы к возвращенному объекту, и в каждом случае возвращаемый объект был построен по-разному.

9

В медленном корпоративном мире, в котором я сейчас трачу больше времени, чем хотелось бы, доходность доходности имеет огромное преимущество в том, что ей не нужна эта новая платформа .NET 3.5, которая не будет установлена ​​на менее двух лет.

+0

Прохладный ответ. Но .NET Framework 3.5 скоро обновляется (4.0). –

+10

«.NET Framework 3.5 скоро обновляется» - не там, где я работаю :( – Joe

Смежные вопросы