我需要遍历对象列表,只对 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/