LINQ代码优化:如何消除Select所需FUNC<int,T>带来的无用变量?
解决LINQ Select中冗余未使用变量的问题
嘿,这个场景我太熟悉了——有时候用LINQ方法链写Select时,明明不需要用到源集合的元素,却被迫声明一个完全没用的变量,看着特别别扭!咱们来用几种简洁的方式消除这个冗余,同时保持代码的可读性:
方案1:用查询语法(你偏好的清晰写法)
既然你觉得查询语法更直观,那直接用**下划线_**作为迭代变量就行,这是C#里约定俗成表示“此变量无需使用”的写法:
// 假设原来的冗余代码是这样的: var result = myIntCollection.Select(x => new MyTargetClass()); // 改成查询语法,用下划线明确标记未使用的变量 var result = from _ in myIntCollection select new MyTargetClass();
这种写法一眼就能让阅读者明白:我们只是需要基于源集合的元素数量生成对应数量的新对象,完全不需要用到源元素本身。
方案2:方法链中使用丢弃变量
如果你更习惯流式的方法链写法,同样可以用下划线作为Select的参数名,效果和查询语法一样清晰:
var result = myIntCollection.Select(_ => new MyTargetClass());
这里的_明确传达了“这个参数是故意忽略的”,比用x、temp这类无意义的变量名更具语义性。
额外小提示
如果这种“忽略源元素生成新对象”的操作在你的代码里频繁出现,还可以封装一个扩展方法来进一步简化:
public static IEnumerable<TResult> SelectIgnoringSource<TSource, TResult>( this IEnumerable<TSource> source, Func<TResult> selector) { foreach (var _ in source) { yield return selector(); } } // 使用时就不用写下划线了: var result = myIntCollection.SelectIgnoringSource(() => new MyTargetClass());
不过这个扩展方法属于“锦上添花”,如果只是偶尔用到,前面两种方案已经足够简洁。
总的来说,用下划线标记未使用的变量是最通用、最易读的解决方案,不管是查询语法还是方法链都适用,完美消除冗余的同时也保持了代码的清晰度!
内容的提问来源于stack exchange,提问作者Falco Alexander
相关产品推荐
相关产品推荐

