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();
}