【问题标题】:Foreach/For loop alternative lambda function?Foreach/For 循环替代 lambda 函数?
【发布时间】:2016-04-25 23:39:05
【问题描述】:

我们使用 for 或 foreach 循环遍历集合并处理每个条目。

在所有这些新的 C# 集合的 lambda 函数中是否有任何替代方法?

传统的做法

foreach(var v in vs)
{
  Console.write(v);
}

有什么类似的吗?

vs.foreach(v => console.write(v))

【问题讨论】:

标签: c#


【解决方案1】:

List 有 ForEach 方法,而 IEnumerable 没有。

对此有很多问题/答案。我认为它没有在 IEnumerable 中实现的主要原因是,Linq on Enumerables “意味着”没有副作用,因为它是一种查询语言。

Eric Lippert 在他的博客上解释了他的想法。

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

【讨论】:

  • +1 链接到 Eric Lippert 的博客,他解释了为什么这样做是一个坏主意(传统的 foreach 实际上更好)。
【解决方案2】:

是的。

IList中,有一个ForEach扩展方法:

List 有一个 ForEach 方法:

List<string> list = new List<string>() { "1", "2", "3", "4" };

list.ForEach(s => Console.WriteLine(s));

这就是你要找的吗?

【讨论】:

  • 明确一点:它是List&lt;T&gt; 中的方法,它不是扩展方法。将 ForEach 添加到 LINQ 是没有意义的,但是将它移到 IList&lt;T&gt; 是有意义的:转到 here 来支持它! :)
  • 嗯,我的立场是正确的。我一直认为它是 IList 的扩展,而不是具体实现的方法。
  • 呵呵关于关闭,我编辑了你的答案,但很抱歉我无法编辑你的评论,请帮助你自己:-)
  • 不知道 Off Of 有什么大不了的。有人愿意解释一下吗?
  • @Ian P:英语方面,我不太清楚,我不是母语人士。但不知何故,如果你是一名程序员,你就会开始有一种英语语言的感觉(off 不是在那里使用的☺)。在我编辑的句子中,很难推断出“方法关闭”所传达的意思。而“off of”这个句子是当“off of”前面的词是动词时,而method这个词肯定不是动词。也许这可以说明:tek-tips.com/viewthread.cfm?qid=1447359&page=1 和这个:answerbag.com/q_view/707088。在一个有点相关的注释上:xkcd.com/541
【解决方案3】:

List(T).ForEach 正是这样做的。

【讨论】:

    【解决方案4】:

    默认情况下,没有。
    您可以定义自己的:

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {  
       foreach(T val in source)  
          action(val);  
    }
    

    【讨论】:

      【解决方案5】:

      Eric 提出了一个令人信服的论点,除了 List 有一个 ForEach 但只适用于 List 的事实。我发现很多场合都使用这种非常有用的扩展方法,同样对缺乏 IEnumerable 的通用扩展方法感到沮丧,所以我最终决定自己编写。

      在这样做的过程中,我最终更进一步,编写了一个 Once 和 ForEvery 流畅的扩展方法,允许在每个项目上链接操作,并且在该链中只执行一次操作,如果没有其他原因,只是当时它们似乎是个好主意。

      代码如下:

      public static class EnumerableExtensions
      {   
         public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
         {
            foreach (var item in collection)
            {
               action(item);
            }
         }
      
         public static IEnumerable<T> Once<T>(this IEnumerable<T> collection, 
            Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action)
         {
            if (predicate(collection)) 
               action(collection);
            return collection;
         }
      
         public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection,
            Func<T, bool> predicate, Action<T> action)
         {
            foreach (var item in collection)
            {
               if (predicate(item)) 
                  action(item);
            }
            return collection;
         }
      }
      

      你可以在我的博文Extend IEnumerable with ForEach and Once Methods找到示例使用代码。

      【讨论】:

        【解决方案6】:

        您所写的内容是完全合法的(除了案例) - 假设 vs 的类型将 ForEach 定义为扩展方法,或者如果它是 List

        ForEach 是为List&lt;T&gt; 定义的:

        List&lt;T&gt;的每个元素执行指定的操作。

        【讨论】:

          【解决方案7】:
          vs.ToList().ForEach(item => Console.WriteLine(item));
          

          【讨论】:

            【解决方案8】:

            .NET 3.5 的 Linq 没有 Foreach,尽管 LinqBridge 提供了一个。我习惯了使用 Linqbridge,我很自然地assumed 它是 .NET 3.5 Framework 的一部分

            如果您认为它可以为您的程序带来清晰性,只需将其添加到您的扩展方法集合中

            static class Helper
            {
                public static IEnumerable<t> ForEeach<t>
                    (this IEnumerable<t> source, Action<t> act)
                {
                    foreach (T element in source) act(element);
                    return source;
                }
            }
            

            【讨论】:

              【解决方案9】:
              static void Main(string[] args)  
              {
                  int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9};
                  var data = i.ToList();
              
                  data.ForEach(m => { Console.WriteLine(m); });
              
                  Console.ReadKey();
              }
              

              【讨论】:

                猜你喜欢
                • 2021-07-12
                • 1970-01-01
                • 1970-01-01
                • 2022-11-03
                • 2019-04-04
                • 2018-08-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多