不使用foreach循环将遍历打印逻辑转换为LINQ表达式的方法
实现结论
完全可以在不编写显式循环语句的前提下实现需求,你之前写的Select版本没有输出,核心原因是LINQ默认采用延迟执行机制:仅构造查询逻辑不会触发委托执行,只有实际枚举序列时才会运行你写的打印逻辑。
正确写法
推荐写法(最简洁)
直接使用List<T>自带的ForEach方法即可,不需要手写foreach循环:
public void PrintMinMaxAvg(List<Packet> packets) { packets.ForEach(packet => { var min = packet.Values.Min(); var max = packet.Values.Max(); var avg = packet.Values.Average(); Console.WriteLine($"min: {min}, max: {max}, avg: {avg}"); }); }
如果要省掉临时变量,也可以直接把计算逻辑写在字符串插值里,和你之前的写法保持一致。
纯标准LINQ写法(不推荐生产环境使用)
如果你要求必须使用标准LINQ查询方法,只需要在你原有代码的基础上追加一个触发枚举的方法即可,比如ToList():
packets.Select(packet => Console.WriteLine($"min: {packet.Values.Min()}, max: {packet.Values.Max()}, avg: {packet.Values.Average()}") ).ToList();
注意:LINQ的设计初衷是做无副作用的数据查询,用
Select执行打印这类带副作用的操作不符合LINQ的设计约定,可读性和可维护性都不如显式循环或者List.ForEach写法,仅作功能实现演示。
补充说明
上面两种实现都没有编写显式的foreach/for循环语句,循环逻辑是封装在框架方法内部完成的,满足你的要求。如果是生产环境开发,原始的显式foreach写法反而可读性更高,也更便于后续调试修改。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

