有谁知道在数据对象上添加LINQ的foreach将枚举一次还是多次?

m4pnthwp  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(104)

我想知道哪一个更有效。
第一个例子使用'continue;'确保我们只枚举列表一次,但我们包括我们不感兴趣的行,直到循环完成。

foreach (object in List)
{
  if (object.something == null)
   {
    continue;
   }

  //Do Stuff
}

字符串
第二个例子在list对象上使用LINQ,阻止foreach枚举不需要的行,但我怀疑where check可能在循环开始之前就进行了完整的枚举,从而降低了效率。

foreach (object in List.Where(x => x.something != null))
 {
   //Do Stuff
 }


我不关心可读性。只有速度!有没有人确切地知道哪一个更有效(或者有没有其他跳过行而不事先从列表中删除它们的想法)?

xytpbqjk

xytpbqjk1#

这基本上已经在评论中得到了回答--如果性能对你很重要,那么你需要尽可能接近真实的场景来比较你的两个实现。
我认为有必要明确地回答你的担忧,“where检查可能在循环开始之前就进行了完整的枚举,使其效率降低”-这是没有根据的。
Where方法返回一个IEnumerable<T>,其中T是您的类。此类型包含有关如何执行查询的指令,但在枚举查询之前并不实际执行查询,这称为延迟执行。然后,在枚举每个元素时,依次对每个元素迭代地执行查询。在本例中,foreach将通过以下方式执行枚举:
1.从列表中请求每个元素
1.根据Where表达式过滤元素

  1. EITHER:跳过元素
  2. OR:在循环中执行元素的代码
    List.Where(...).ToList()相比,正如您所说,List.Where(...).ToList()甚至在循环开始之前就完成了完整的枚举。
    希望这对你有帮助:)

相关问题