LINQ Select中高效过滤Null值的最优方案(XElement场景)
解决IEnumerable过滤Null值且避免额外遍历的方案
嘿,我完全理解你不想额外加Where或RemoveAll来过滤Null、追求单次遍历最优性能的需求——毕竟多一次循环就多一点开销,尤其是处理大量元素的时候。
问题的核心在于:Select是一对一的映射,每个输入元素必须返回一个结果(哪怕是Null),没办法直接跳过元素。但我们可以用SelectMany来替代,它支持一对零或多的映射,刚好能满足你的需求:
.SelectMany(versiones => { var last = versiones.Elements().Last(); if (last.condition) { var foo = bar(last); // 符合条件时,返回包含单个有效对象的集合 return new[] { new { Last = last, Foo = foo } }; } // 不符合条件时,返回空集合,相当于直接跳过这个元素 return Enumerable.Empty<object>(); })
为什么这能满足性能要求?
SelectMany会在一次遍历过程中完成映射+过滤:它会把每个输入元素对应的集合(要么是单个有效对象,要么是空集合)自动扁平化,最终直接生成不含Null的IEnumerable。整个过程没有额外的遍历步骤,和你原来用Select的遍历次数完全一致,只是把Null替换成了空集合,而空集合会被自动忽略。
如果想让代码更简洁,还可以用三元表达式简化:
.SelectMany(versiones => { var last = versiones.Elements().Last(); return last.condition ? new[] { new { Last = last, Foo = bar(last) } } : Enumerable.Empty<object>(); })
这样处理后,你的结果集合就只会包含符合条件的有效对象,完全没有Null元素,同时保持了最优的遍历性能。
内容的提问来源于stack exchange,提问作者pikamorfo
相关产品推荐
相关产品推荐

