2016-03-09 4 views
5

Возможно ли использовать yield встроенный метод ForEach?foreach vs ForEach с использованием урожая

private static IEnumerable<string> DoStuff(string Input) 
{ 
    List<string> sResult = GetData(Input); 
    sResult.ForEach(x => DoStuff(x)); 

    //does not work 
    sResult.ForEach(item => yield return item;); 

    //does work 
    foreach(string item in sResult) yield return item; 
} 

Если нет, есть ли причина, по которой он не работает?

+1

Посмотрите на: http://stackoverflow.com/q/1217729/1859022 – user1859022

+4

Во-первых, * Зачем использовать этот синтаксис вместо '.Select (x => DoStuff (x))'? Во-вторых, 'ForEach' не возвращает результат, поэтому попытка вернуть что-либо с' return' или 'yield' недействительна –

+0

@PanagiotisKanavos' Select' не работает в сочетании с рекурсивным подходом – fubo

ответ

7

Потому что, как вы можете видеть here функция лямбда компилируется в отдельный метод:

Это:

x => DoStuff(x) 

преобразуется в

internal void <DoStuff>b__1_0(string x) 
{ 
    C.DoStuff(x); 
} 

Этот отдельный метод не является IEnumerable<>, поэтому он явно не может поддерживать ключевое слово yield.

Так, например, это:

item => yield return item; 

будет преобразован:

internal void <DoStuff>b__1_0(string item) 
{ 
    yield return item; 
} 

, который имеет yield но не IEnumerable<string>.

9

No, List<T>.ForEach не может быть использован для этого.

принимает делегата Action<T>.

Action<T> «Инкапсулирует метод, который имеет единственный параметр и не возвращает значение».

Итак, созданная вами лямбда не может вернуть ничего, если она «подходит» в Action<T>.