C# - 对 IEnumerable<T> 的操作

标签 c# delegates extension-methods ienumerable

我已经实现了这个扩展方法:

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/

相关文章:

c# - 从给定字符串中查找电话号码 C#

C#委托(delegate)只写出最后一个方法

c# - 在静态上下文中调用 C# 扩展方法是否有效?

c# - 常规方法的 Action/Func 扩展方法

c# - 向字符串类 C# 添加新属性

c# - 捕获错误过多导致性能不佳?

c# - 如何使用 POSTMAN 模拟 Webhook 并在 Action 中接收它

c# - C# 中的自定义表达式解析器

ios - 如何将参数传递给委托(delegate)回调方法?

c# - 处理任何类型的方法