代码之家  ›  专栏  ›  技术社区  ›  Shuo

.Net标准库中是否有.Each()或.ForEach()迭代器?[副本]

  •  14
  • Shuo  · 技术社区  · 15 年前

    可能重复:
    LINQ equivalent of foreach for IEnumerable<T>

    我想知道.Net库中是否有类似于以下.Each()的IEnumerable方法

    var intArray = new [] {1, 2, 3, 4};
    intArrary.Each(Console.WriteLine);
    

    我知道我可以用 foreach 循环或轻松编写如下扩展方法:

    public static class EnumerableExtensions
    {
        public static void Each<T>(this IEnumerable<T> enumberable, Action<T> action)
        {
            foreach (var item in enumberable)
            {
                action(item);
            }
        }
    }
    

    但如果库中已经存在这样的扩展方法,我希望不要创建自己的方法来扰乱代码。而且像.Each()这样的东西(有一些重载,可以将条件作为额外的参数)是程序员非常需要的,而且应该已经有一个了。我说的对吗?

    更新

    Ruby开发人员可以将其识别为.each()迭代器。这就是我希望在C#中拥有的东西。也许C可以有更多类似于Ruby的迭代器方法。

    6 回复  |  直到 9 年前
        1
  •  10
  •   Michael B    12 年前

    正如其他人所说,没有一个是建立在 IEnumerable<T> . 根据埃里克·利佩特的这篇文章,林肯团队反对: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

    上有一个静态方法 Array.ForEach List<T> 有一个实例方法。PLINQ foreach中也有类似的语句,但要注意它们是并行工作的,对于非常简单的操作可能会导致非常糟糕的性能。 PLINQ中有这样一种方法: http://msdn.microsoft.com/en-us/library/dd383744.aspx

    以下是关于PLINQ的一般指南: http://msdn.microsoft.com/en-us/library/dd460688.aspx

    虽然我找不到确切的文章,如果你在parrallenumerable部分搜索,它给出了关于如何提高在代码中使用并行性的性能的警告和提示

    如果需要,我建议创建两个版本,一个包含索引器,另一个不包含索引器。这非常有用,可以保存select语句来获取索引。 例如

    public static void ForEach<T>(IEnumerable<T> enumerable,Action<T> action)
    {
        foreach(var item in enumerable) action(item);
    }
    
    public static void ForEach<T>(IEnumerable<T> enumerable,Action<T,int> action)
    {
        int index = 0;
        foreach(var item in enumerable) action(item,index++);
    }
    

    我还将包括参数验证,因为这些是公共方法。

        2
  •  5
  •   Raphael    15 年前

    是的。

    someList.ForEach(x => Console.WriteLine(x));
    

    或使用数组:

    Array.ForEach(someArray, x => Console.WriteLine(x));
    

    注意,在最后一个例子中,必须调用数组类上的static方法

    编辑:命名空间为: System.Collections.Generic系统 对于List方法和 系统 对于数组方法

        3
  •  2
  •   Erik van Brakel scottrakes    15 年前

    System.Collections.List上有ForEach方法,但IEnumerable上没有。注意,这也不是LINQ的一部分(它已经存在于.NET 2.0中)。

    乍一看,您会认为这是LINQ的一部分,因为它是普通列表功能的一种扩展。然而,LINQ更多的是关于分组、过滤和转换数据。如果你仔细看,大多数(如果不是全部,我不是乔恩·斯凯特,我不知道那些东西的心!)LINQ方法返回某种IEnumerable。

    不过,你可能想看看 MoreLinq . 这是一个开源项目,它向现有的LINQ对象添加了一些关键特性,其中一个是您想要的FrACH方法(在这种情况下,在任何iQueDead上工作,因此它也将在您的数组上工作)。

        4
  •  1
  •   Jörg W Mittag    15 年前

    不,不幸的是没有。(我想这个问题以前已经讨论过了,但现在找不到。)

    由于一些奇怪的历史事故 ForEach 方法结束于 List<T> ,而不是 IEnumerable<T> ,因为它是向后兼容的,所以永远无法修复。

    自从存在扩展方法以来,增加了 ForEach(this IEnumerable<T>, ...) 一次又一次地请求扩展方法,但它通常被拒绝,因为它会导致混乱的行为:因为实例方法总是在扩展方法之前被选择,这意味着 全部的 IEnumerable 我们得到同样的待遇, 除了 List 他们不允许在BCL中出现这种不一致。

    因此,这个星球上几乎所有的.NET项目现在都是从您上面描述的代码开始的:

    namespace IEnumerableExtensions
    {
        public static class IEnumerableExtensions
        {
            public static void ForEach<T>(this IEnumerable<T> xs, Action<T> f)
            {
                foreach (var x in xs) f(x);
            }
        }
    }
    
        5
  •  0
  •   Andrew Hare    15 年前

    只有 List<T> 提供 ForEach 方法-对于所有其他类型,您必须滚动自己的扩展方法。

        6
  •  0
  •   Ali Tarhini    15 年前

    这取决于框架版本

    .net 3.5和4.0具有 ForEach 方法