C# 哪一个在条件循环中更有效?

C# 哪一个在条件循环中更有效?,c#,collections,foreach,C#,Collections,Foreach,假设我有以下收藏 IEnumerable<car> cars = new IEnumerable<car>(); 或者另一种方式: 方法B: foreach( var item in cars.where(c=>c.color==white)){ doSomething(); } foreach( var item in cars.where(c=>c.color!=white)){ doSomeOtherthing(); } 对我来说,我认为

假设我有以下收藏

IEnumerable<car> cars = new IEnumerable<car>();
或者另一种方式:
方法B:

foreach( var item in cars.where(c=>c.color==white)){
   doSomething();
}

foreach( var item in cars.where(c=>c.color!=white)){
  doSomeOtherthing();
}
对我来说,我认为方法A更好。我只在集合中循环一次 而方法B似乎很诱人。框架将为您循环和过滤集合


那么哪种方法更好更快呢?

好吧,这取决于过滤过程有多复杂。它的效率可能非常高,以至于与此无关,特别是考虑到您不再需要使用
if
语句进行自己的过滤

我要说的一件事是:除非你的收藏量很大,否则它可能不会带来足够大的区别。而且,有时,优化可读性比优化速度要好:-)


但是,如果你真的想知道,你可以测量!使用合适的生产数据(如测试数据)对环境中的操作计时。这是唯一可以确定的方法。

方法A比方法B更具可读性。只有一个问题,是car.color还是item.color?

这可能是过早优化的情况,但第一个循环通常更快,虽然不是因为它只循环一次,而是因为它不分配任何内存,避免了额外的函数调用,所以它会更快。(第二个版本必须为两个lambda和可能的两个枚举数分配内存,并为每个项调用lambda函数一次。)更快的方法是将数据拆分为两个集合,并对每个集合执行两个紧密循环。如果不能做到这一点,按颜色排序也会有所帮助,因为这样分支预测器可以做得很好。顺便问一下,Brilliant name/avatar combo:-)你是否认为LINQ扩展没有执行比较?Ed S。我想知道使用LINQ进行过滤是否比使用if elseYet更快,直接回答这个问题,我无法想象任何情况下B的效率与A相同或更高。@EdS,可能不是,但可能它们像DBMS表一样按颜色索引,或者保存在白色和非白色散列桶中:-)不太可能,但我的建议仍然是:测量,不要猜测。哈哈,是的,这正是我想到的。如果它是一个AsParallel,LINQ查询在多核系统上应该更快。但再一次,这仍然取决于数据,他必须进行测量。但我很容易想到LINQ查询速度更快的情况。
foreach( var item in cars.where(c=>c.color==white)){
   doSomething();
}

foreach( var item in cars.where(c=>c.color!=white)){
  doSomeOtherthing();
}