我已经实现了这种扩展方法:
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));
没有任何内容写入控制台。任何想法为什么这不起作用?感谢
答案 0 :(得分: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
次迭代时打印。构造查询时不会打印任何元素
答案 1 :(得分:5)
这是因为你正在返回一个迭代器,但却没有执行它。根据你所写的内容,你想要在列表上执行一个动作,而不是从中获取一个枚举器,所以看起来你需要让DoForEach()函数返回void,并且去除yield返回它。这应该将您的输出写入控制台。
编辑:这是一个显示我的意思的片段:
public static void DoForEach<T>(this IEnumerable<T> data, Action<T> action)
{
foreach (T value in data)
{
action(value);
}
}