带continue的foreach与LINQ Where过滤的foreach哪个更高效?
两种列表遍历方式的效率对比与优化方案
首先明确一个关键事实:LINQ的Where方法是延迟执行的——它不会在循环开始前全量枚举整个列表,而是在foreach遍历过程中,逐个取出原列表的元素,执行过滤条件,符合条件的才会进入循环体。
接下来对比两种方式的执行效率:
第一种:foreach+continue
代码示例:foreach (var obj in List) { if (obj.something == null) { continue; } // Do Stuff }这种方式只遍历列表一次,没有额外的委托调用开销,判断逻辑直接内联在循环里,执行效率很高。
第二种:Where+foreach
代码示例:foreach (var obj in List.Where(x => x.something != null)) { // Do Stuff }虽然
Where不会提前全量枚举,但它每次过滤元素都需要调用传入的lambda委托,这会带来微小但不可忽略的额外开销,所以整体效率会比第一种方式稍慢。
如果追求极致的执行速度,除了第一种方式外,还可以使用for循环直接通过索引访问(仅适用于List<T>这类支持快速索引的集合):
for (int i = 0; i < List.Count; i++) { var obj = List[i]; if (obj.something == null) continue; // Do Stuff }
这种方式不需要创建枚举器对象,直接通过索引访问元素,避免了foreach枚举器的额外开销,在大量元素的场景下速度会比foreach+continue更快。
内容的提问来源于stack exchange,提问作者GuMa Games
相关产品推荐
相关产品推荐

