【问题标题】:Which of these 3 foreach function's should i use? Where is the difference? [closed]我应该使用这 3 个 foreach 函数中的哪一个?区别在哪里? [关闭]
【发布时间】:2020-09-05 11:00:53
【问题描述】:

我有 3 个 foreach 函数,将类型/类 Person 的列表 l 写入控制台

            foreach(Person p in l)
            {
                Console.WriteLine(p.first);
                Console.WriteLine(p.last);
            }

            l.ForEach(p =>
            {
                Console.WriteLine(p.first);
                Console.WriteLine(p.last);
            });

            Parallel.ForEach(l, p =>
            {
                Console.WriteLine(p.first);
                Console.WriteLine(p.last);
            });

他们都在做同样的事情,除了我猜 Parallel 正在处理线程。 什么时候用什么?

【问题讨论】:

  • 多线程只有在事情受益于所述线程时才有意义。简单的控制台输出不会从中受益。在前两者之间,主要是基于意见
  • 其中任何一个都没有“应该”。首先,你有意见,前两个是不同人的最爱,所以你不会得到的答案,你只会得到一个的答案。其次,它取决于上下文,仅当您想要并行性时才应使用并行代码,在这种情况下它可能会使输出混乱,所以我会远离它。在我看来,你应该使用第一块。
  • 我认为你应该只使用foreach,除非你从并行性中受益匪浅,并避免使用List.Foreach()。它没有增加任何功能上的好处,只是语法略有不同。问题是它仅适用于List。我见过将数组转换为列表的代码just 以使用ForEach(),这是愚蠢的。
  • 为什么将数组转换为列表会很笨?将数组转换为列表后,最后写起来不是更容易吗?而不是 for(var i = 0; i

标签: c# list class foreach constructor


【解决方案1】:

这里您使用的是在List<> 类上定义的方法:

l.ForEach(p => { ... });

在内部,它使用 for loop 来迭代集合。当您想要更短且更易读的代码时使用它。

标准foreach 提供了对循环的更多控制,例如满足特定条件时跳出循环。如果想了解更多相关信息,请查看article,它提供了有关此类主题的深入信息。

与标准的foreach 循环相比,Parallel.ForEach 循环以并行方式执行。正如您已经建议的那样,它使用多个线程。当您想同时执行多个进程时使用它。阅读更多关于此here 的信息。

Parallel.ForEach(l, p => { ... });

【讨论】:

  • ForEach 不是 LINQ。它仅在 List<T> 上定义。
  • 啊,是的。你是对的:) 感谢您指出这一点。我会编辑它。
  • 也不是扩展方法。
  • 此外,ForEach 并没有在后台使用 foreach 循环。而是 for 循环
  • 是的,是的。再次抱歉。 :) 我将此与我前段时间实现的扩展方法混淆了。这些是在底层使用 foreach 的扩展方法。
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多