2013-05-05 36 views

回答

8

yield return讓你查詢懶,換言之,只有當你開始遍歷元素的方法執行。如果deferred fashion執行了許多LINQ操作符。接下來的代碼演示了這個問題

new[] {1,2}.DoForEach(Console.WriteLine).ToList(); 

打印:

1 
2 

new[] {1,2}.DoForEach(Console.WriteLine); 

打印什麼

給予充分例如,檢查下一個片段:

IEnumerable items = new[] {1,2}.DoForEach(s => Console.WriteLine("inside query:"+s)); 

foreach (var item in items) 
{ 
    Console.WriteLine ("inside loop:" + item); 
} 

這將打印

inside query:1 
inside loop:1 
inside query:2 
inside loop:2 

,它會開始打印只在第一foreach迭代。當您構建查詢時沒有元素被打印

+0

aaah明白了。謝謝 – 2013-05-05 20:18:22

5

這是因爲你正在返回一個迭代器,但沒有執行它。考慮到你寫了什麼,你想要在列表上執行一個操作,而不是從它返回一個枚舉器,所以看起來你需要讓DoForEach()函數返回void,並且擺脫返回它。這應該將您的輸出寫入控制檯。

編輯:這是顯示我的意思是一個片段:

public static void DoForEach<T>(this IEnumerable<T> data, Action<T> action) 
    { 
     foreach (T value in data) 
     { 
      action(value); 
     } 
    } 
相關問題