我有几个地点的交易数据表,我需要从一个位置子集中找到每个位置的最大值。想象一下下表:
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和2009年的位置124选择值64.
我有以下代码,它可以找到每个位置的最大值,然后将其添加到运行总计中。
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;
}
}
有更优雅的编码方式吗?
答案 0 :(得分:8)
我正在使用您上面示例中表格中使用的命名。从您的代码判断,您可能需要相应地更改一些名称......但我不能肯定:
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));
答案 1 :(得分:2)
这适用于所有地点。我只是 想要获得子集的值。
然后对Justin's answer的这个小修改怎么样?
var sum = transaction
.GroupBy(x => x.Location)
.Where(g => locationIds.Contains(g.Key))
.Sum(g => g.Max(x => x.Transactions));