Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一个LINQ查询会给我几个最大值的总和?_C#_Linq - Fatal编程技术网

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));