1

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

我需要选择当前我正在做的每个 A 的 max(double):

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 查询,但无法弄清楚语法。有什么帮助吗?

4

1 回答 1

5

我将假设 max(int) 你的意思是“max”,因为每个唯一 A 的最大 double 跨越所有A_Lists,这似乎实际上是字典。

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

  1. 使用SelectMany折叠所有键值对
  2. 使用GroupBy按唯一 A 分组
  3. 使用ToDictionary 获取每个 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 实现的相同元组上产生一个 IEnumerable 迭代器[A, double]

于 2013-02-18T14:37:06.923 回答