C# 是否有一个LINQ查询会给我几个最大值的总和?
我有一个多个位置的事务数据表,我需要从位置子集中找到每个位置的最大值之和。想象一下下表:C# 是否有一个LINQ查询会给我几个最大值的总和?,c#,linq,C#,Linq,我有一个多个位置的事务数据表,我需要从位置子集中找到每个位置的最大值之和。想象一下下表: location year transactions 123 2009 57 124 2009 23 125 2009 45 123 2010 64 124 2010 12 125 2010 66 因此,如果我只查找位置123和124的数据,代码应该在2010年为位置12
location year transactions
123 2009 57
124 2009 23
125 2009 45
123 2010 64
124 2010 12
125 2010 66
因此,如果我只查找位置123和124的数据,代码应该在2010年为位置123选择值64,在2009年为位置124选择值23
我有下面的代码,它找到每个位置的最大值,然后将其添加到运行总数中
int total = 0;
foreach (var location in locationIds)
{
int? temp = transactions.Where(t => t.Location == location)
.Max(t => t.Transactions);
if (temp.HasValue)
{
total += temp.Value;
}
}
有没有更优雅的编码方式?我使用的是您在上面示例的表格中使用的命名方式。从您的代码判断,您可能需要相应地更改一些名称…但我不能肯定:
var locationsToInclude = new List<int> { 123, 124 };
var sum = transaction
.Where(t => locationsToInclude.Contains(t.location))
.GroupBy(t => t.location)
.Sum(g => g.Max(t => t.transactions));
var locationsToInclude=新列表{123,124};
var总和=交易
.Where(t=>locationsToInclude.Contains(t.location))
.GroupBy(t=>t.location)
.Sum(g=>g.Max(t=>t.transactions));
这适用于所有位置。我只是
要获取子集的值
那么,对其进行小小的修改怎么样
@Justin,+1,但我不认为您是
Select
子句需要返回键,而且iGroup
上没有“Value”属性;只要。选择(x=>x.Max(y=>y.Number))
就足够了。(将下面的子句修改为.Sum(x=>x)
当然。)对于命名number
=事务中的不一致性,很抱歉,这几乎是正确的,但是分组上没有值
属性-它应该是.Sum(grp=>grp.Max(v=>v.number))代码>+1:编辑版本是最好的方式,尽管它不是一个键值对序列,但它已经是一个IEnumerable
。删除了我的副本。+1:这是一个很好的LINQ查询示例,它实际上是可读的。我看到很多这样的问题要求将传统代码转换为LINQ语句,而LINQ解决方案最终会变得非常难以理解和阅读。根据他使用的LINQ提供程序,在分组之前使用Where子句进行筛选不是更有效吗(我认为分组比过滤更密集)。当然这是一个过早的优化……但好奇的问题从未减少。@Justin:是的,我(非常自信地)认为你是对的。我认为你的更新版本最有意义。
var sum = transaction
.GroupBy(x => x.Location)
.Where(g => locationIds.Contains(g.Key))
.Sum(g => g.Max(x => x.Transactions));