我已经实现了这个扩展方法:
public static IEnumerable<T> DoForEach<T>(this IEnumerable<T> data, Action<T> action)
{
foreach (T value in data)
{
action(value);
yield return value;
}
}
当我这样做的时候
output.DoForEach<string>(c => Console.WriteLine(c));
控制台上没有任何内容。任何想法为什么这不起作用?谢谢
最佳答案
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
迭代时开始打印。构造查询时没有打印任何元素
关于C# - 对 IEnumerable<T> 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388652/