c# - LINQ + Foreach 与 Foreach + If

标签 c# linq foreach

我需要遍历对象列表,只对 bool 属性设置为 true 的对象执行某些操作。我在这段代码之间争论

foreach (RouteParameter parameter in parameters.Where(p => p.Condition))
{ //do something }

和这段代码

foreach (RouteParameter parameter in parameters)
{ 
  if !parameter.Condition
    continue;
  //do something
}

第一个代码显然更简洁,但我怀疑它将遍历列表两次 - 一次用于查询,一次用于 foreach。这不会是一个很大的列表,所以我并不过分关心性能,但循环两次的想法只是 bug 我。

问题:有没有一种干净/漂亮的方法可以不用循环两次来编写这个代码?

最佳答案

Jon Skeet 有时会制作一个真人 LINQ 演示来解释其工作原理。想象一下你有三个人在舞台上。在左边,我们有一个人拿着一副洗好的纸牌。在中间,我们有一个只传红牌的人,在右边,我们有一个想要红牌的人。

右边的人戳了中间的人。中间的人戳左边的人。左边的人递给中间的人一张卡片。如果是黑色的,中间的人把它扔到地上,然后再戳,直到他得到一张红牌,然后把红牌递给右边的人。然后右边的家伙又戳了戳中间的家伙。

这一直持续到左边的人用完牌为止。

这副牌从头到尾没有翻过不止一次。但是,左边和中间的人都处理了 52 张牌,右边的人处理了 26 张牌。卡片上总共有 52 + 52 + 26 次操作,但是这副牌只循环了一次

您的“LINQ”版本和“继续”版本是同一回事;如果你有

foreach(var card in deck)
{
    if (card.IsBlack) continue;
    ... use card ...

然后有 52 个操作从一副牌中取出每张牌,52 个操作测试每张牌是否是黑色的,还有 26 个操作对红牌进行操作。完全一样。

关于c# - LINQ + Foreach 与 Foreach + If,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072126/

相关文章:

c# - 在 C# 中,我可以让自动属性在属性的帮助下执行一些额外的工作吗?

c# - 我可以使用并返回 EF4 代码优先 POCO 实体作为它们的接口(interface)吗?

.net - 如何将 IQueryable<Something> 作为 IQueryable<ISomething> 返回

C# ConcurrentDictionary 使用不一致的可访问性?

c# - ASP.NET + C# 的最佳资源是什么?

c# - 如何使用Mvvm将页面推送到MasterDetailPage

regex - Powershell foreach 路径找不到文件

checkbox - 获取转发器中所有复选框的值

c# - 可以使用 LINQ 从字符串中提取关键字吗?

c# - 我想基于字符串和 int 对 Linq 中的组内的对象进行排序