代码之家  ›  专栏  ›  技术社区  ›  Elazar Leibovich

为什么ForEach方法仅适用于列表

  •  9
  • Elazar Leibovich  · 技术社区  · 14 年前

    从我所看到的情况来看 ForEach List class .

    为什么呢?我看不出有什么理由这样做 弗雷奇 不可用于任何实现 IEnumerable IEnumerator 接口,如果您需要执行一个小操作(1行比1行+2样板foreach语法更可读),这是一个非常有用的方法。

    我会澄清我的问题。有完全合理的理由包括 弗雷奇 按顺序。这完全有充分的理由 在所有序列中。

    弗雷奇

    5 回复  |  直到 14 年前
        1
  •  23
  •   Elazar Leibovich    14 年前

    请参阅Eric Lippert的帖子: "foreach" vs "ForEach"

    很多人问我为什么 没有提供Microsoft 方法。List类有这样一个 没有理由认为这样的方法不可行 所有序列。

    ...

    哲学上反对提供 这种方法有两个原因。

    第一个原因是这样做 违反函数式编程 运算符基于。显然 调用此方法的唯一目的 会引起副作用。

    ...

    第二个原因是这样做 增加零新的代表权

    ...

    嗯,VS语言团队没有 对所发生的事情有影响吗 列表上的“ForEach”方法 IEnumerable上的可拓方法 麻烦(而VSL团队做到了 控制它。)那个 设计成一个可变的, 不是没有副作用的数据结构, 所以使用变异的表达式

        2
  •  7
  •   Mattias Jakobsson    14 年前

    没错,该方法是在List类中定义的。然而,创建一个做同样事情的扩展方法非常容易。

    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (var t in enumerable)
            action(t);
    }
    
        3
  •  2
  •   Ahmad Mageed    14 年前

    对的但是,如果您想利用ForEach循环的优势,可以使用一个名为“ToList”的方法将数组转换回List,如下所示。

    String[] array = new String[3];
    List<String> list = array.ToList<String>();
    
        4
  •  2
  •   Dave Van den Eynde    14 年前

    从技术上讲,使用.NET3.5,您可以这样做:(您需要包括System.Linq)

    IEnumerable<string> a = ...
    
    a.All(i => { DoSomethingWith(i); return true; });
    
        5
  •  0
  •   Matthew Whited    14 年前

    下面是支持异常处理的.ForEach()扩展方法的不同版本。这将捕获所有例外,因此您可能希望重新引用那些您不处理的例外。

    =null 从方法签名开始)

    public static void SafeForEach<T>(this IEnumerable<T> input,
                                           Action<T> action,
                                           Action<T, Exception> faultAction = null)
    {
        if (input == null || action == null)
            return;
        foreach (var item in input)
            try
            {
                action(item);
            }
            catch (Exception ex)
            {
                if (faultAction == null)
                    Debug.WriteLine(ex);
                else
                    faultAction(item, ex);
            }
    }