【问题标题】:I need to find max total of the sum of integers in Generic list using Linq我需要使用 Linq 在通用列表中找到整数总和的最大总数
【发布时间】:2020-11-07 22:41:26
【问题描述】:

我有一个类值的通用列表:

List<Values> listObj = new List<Values>();
                
listObj.Add(new Values{A = 2, B=4 , C= 3,D =8});
listObj.Add(new Values{A =10, B=5 , C= 13,D =8});
listObj.Add(new Values{A =4, B=14 , C= 1,D =3});
listObj.Add(new Values{A =12, B=4 , C= 1,D =9});  

如何使用 Linq 从 ABCD 的总和中找出最大数?

示例:var maxTotal = 36(即listObj[1] 中元素的总和)。

请解释我应该如何进行计算以获得 maxTotal?

提前致谢。

【问题讨论】:

标签: c# .net linq


【解决方案1】:

首先,让我们用direct initialization改进你的初始化部分:

var listObj = new List<Values>
{
    new Values { A = 2, B = 4, C = 3, D = 8 },
    new Values { A = 10, B = 5, C  = 13, D = 8 },
    new Values { A = 4, B  = 14, C = 1, D = 3 },
    new Values { A = 12, B = 4, C  = 1, D = 9 }
};   

LINQ 中有很多聚合函数,但在这种特殊情况下,您需要使用Max() 扩展方法(官方参考here)。

现在,我想为您提供一种解决问题的通用方法,以防您不想依赖属性的数量来计算它们的总和。为此,我们可能需要使用Reflection 技术。


最后结合以上考虑,让我们看看最终结果如何:

var sumOfProps = new Func<Values, int>((Values v) =>
{
    return typeof(Values)
          .GetProperties()
          .Where(x => x.PropertyType == typeof(int)) // asuming that in your example we 
                                                     // want to consider only int variables
          .Sum(p => (int)p.GetValue(v));
});

var result = listObj.Max(l => sumOfProps(l));

注意:在这种情况下,您不依赖于属性的数量。


但是,有时使用反射被认为是有点繁重的操作,所以在这种情况下,这里是最简单的替代方案:

var result = listObj.Max(l => l.A + l.B + l.C + l.D);

【讨论】:

  • 我可能会在类中公开一个计算的 sum 属性并针对它进行聚合总和,可能由接口支持。
  • @asawyer 这也是一个好主意,比如让Total 属性返回sum 的元素。但是,有时您无法控制该类,就像它可能来自外部库一样,或者您只是无权更改它,因为它可能会影响项目的许多其他区域。对于这些情况,您可能需要使用上述解决方案。
  • 即使没有直接访问修改类型的权限,如果您不想用不同的 a+b+c 乱扔代码库,您始终可以添加扩展方法来进行求和并避免反射损失+d 输入 Max 调用,或者求和逻辑需要一些特殊的东西。不过可能有点矫枉过正。
  • @asawyer,同意 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多