【问题标题】:C# - action on IEnumerable<T>C# - 对 IEnumerable<T> 的操作
【发布时间】:2013-05-05 20:10:27
【问题描述】:

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

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));

没有任何东西被写入控制台。任何想法为什么这不起作用?谢谢

【问题讨论】:

    标签: c# delegates extension-methods ienumerable


    【解决方案1】:

    yield return 使您的查询变得懒惰,换句话说,您的方法仅在您开始迭代元素时执行。如果deferred fashion,则执行大量 LINQ 运算符。下一段代码演示了这个问题

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

    打印:

    1
    2
    

    同时

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

    什么都不打印

    为了给出完整的例子,检查下一个 sn-p:

    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 迭代时开始打印。构建查询时不会打印任何元素

    【讨论】:

      【解决方案2】:

      这是因为您返回了一个迭代器,但没有执行它。鉴于您所写的内容,您希望对列表执行一项操作,而不是从中获取枚举数,因此看起来您需要让 DoForEach() 函数返回 void,并在它。这应该将您的输出写入控制台。

      编辑:这是一个显示我的意思的 sn-p:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多