项目列表中每个项目的最大值

时间:2013-02-18 14:23:46

标签: c# linq

我有一个C类,它有一个List [B],每个B都有一个Dictionary [A,double]

我需要选择每A的最大(双倍) 目前我在做:

Dictionary<A,double> rtn = new Dictionary<A,double>();
foreach (var B in C.Bs)
{
    foreach (var kvpA in B.A_list.Where(a => !rtn.Keys.ToList().Contains(a)))
    {
        rtn.Add(kvpA.Key, kvpA.Value);
    }
    foreach(var kvpA in B.A_list.Where(a => rtn.Keys.Contains(a) && a.Value>rtn[a]))
    {
        rtn[kvpA.Key] = kvpA.Value;
    }
}
return rtn;

然而,这看起来相当混乱所以我正在尝试构建一个更好的linq查询,但无法弄清楚语法。有什么帮助吗?

1 个答案:

答案 0 :(得分:5)

我假设max(int)你的意思是“max”,就像所有A_Lists中每个唯一A的最大双倍一样,它实际上是字典。

无论如何,您可以在一个LINQ语句中分三步完成所有操作:

  1. 使用SelectMany
  2. 折叠所有键值对
  3. 使用GroupBy
  4. 按唯一A分组
  5. 使用ToDictionary
  6. 获取每个A键的最大双倍数

    其中c是类C的实例:

    var dct = c.Bs.SelectMany(x => x.A_List)
                .GroupBy(p => p.Key, p => p.Value)
                .ToDictionary(g => g.Key, g => g.Max());
    

    您也可以使用ToLookup代替ToDictionary,这将产生与ToDictionary实现的相同[A, double]元组的IEnumerable迭代器。