如何以LINQ友好的更优方式计算多层嵌套对象中孙层级的数值总和?
如何以LINQ友好的更优方式计算多层嵌套对象中孙层级的数值总和?
嘿,看起来你已经在处理多层嵌套对象的求和需求了,我来给你分享几个更简洁、更符合LINQ风格的写法~
首先先补全一下你的类定义(假设你要求和的是Object3里的某个数值属性,比如Value):
public class Object1 { // 其他属性... public IEnumerable<Object2> Object2s { get; set; } = []; } public class Object2 { // 其他属性... public IEnumerable<Object3> Object3s { get; set; } = []; } public class Object3 { // 假设你要求和的是这个数值属性 public int Value { get; set; } }
单Object1实例的求和
如果你只需要对单个Object1实例里所有Object3的Value求和,用SelectMany把嵌套的集合扁平化,再直接Sum就搞定了:
int total = object1.Object2s .SelectMany(o2 => o2.Object3s) // 把所有Object2里的Object3合并成一个集合 .Sum(o3 => o3.Value); // 对合并后的集合里的Value求和
多个Object1实例的求和
如果是处理Object1的集合,那就多一层SelectMany即可:
int total = object1List .SelectMany(o1 => o1.Object2s) // 先把所有Object1里的Object2合并 .SelectMany(o2 => o2.Object3s) // 再合并所有Object2里的Object3 .Sum(o3 => o3.Value);
处理可能为null的集合
要是你的集合有可能是null(比如没初始化),可以用空传播运算符避免空引用异常:
int total = object1.Object2s? .SelectMany(o2 => o2.Object3s)? .Sum(o3 => o3.Value) ?? 0;
对比传统的嵌套foreach写法,这种LINQ链式调用不仅代码更简洁,可读性也更强——一眼就能看出来是把多层集合扁平化后求和,逻辑非常清晰。哪怕以后层级再多,继续加SelectMany就行,扩展性也很好。
备注:内容来源于stack exchange,提问作者CrystalBlue
相关产品推荐
相关产品推荐

