Возврат доходности против возврата
Каковы преимущества/недостатки обоих подходов?
return items.Select(item => DoSomething(item));
против
foreach(var item in items)
{
yield return DoSomething(item);
}
EDIT Как они MSIL примерно эквивалентны, какой из них вы считаете более читаемым?
Ответы
Ответ 1
Метод yield return
заставляет компилятор С# генерировать класс перечислителя "за кулисами", а вызов Select
использует стандартный класс перечисления, параметризованный делегатом. На практике для делегата не должно быть большой разницы между ними, кроме, возможно, дополнительного кадра вызова в случае Select
.
Для того, что стоит, обернуть лямбда вокруг DoSomething
тоже бесполезно; просто передайте ему делегат.
Ответ 2
В медленном корпоративном мире, где я в настоящее время трачу больше времени, чем хотелось бы, доходность доходности имеет огромное преимущество, что ему не нужна эта новая платформа .NET 3.5, которая не будет установлена, по крайней мере, еще 2 года.
Ответ 3
Выбрать только позволяет возвращать один объект для каждого элемента в вашей коллекции "предметы".
Использование дополнительного .Where(x => DoIReallyWantThis(x))
позволяет отсеять нежелательные элементы, но при этом позволяет вам возвращать только один объект на элемент.
Если вы хотите потенциально более одного объекта на элемент, вы можете использовать .SelectMany
, но легко завершить с помощью одной длинной строки, которая будет менее легкой для чтения.
"return return" имеет возможность сделать ваш код более удобочитаемым, если вы просматриваете сложную структуру данных и выделяете биты информации здесь и там. Лучший пример этого, который я видел, был там, где было около дюжины отдельных условий, которые привели бы к возвращенному объекту, и в каждом случае возвращаемый объект был построен по-разному.