2013-05-05 58 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); 
     } 
    } 
相关问题