2013-02-18 39 views
1

我有一个具有一个列表[B]一类的C列表内,并且每个B具有每甲 当前字典[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查询,但无法弄清楚语法。任何帮助?

+2

_“... max(int)per A ...”_你在说什么? – 2013-02-18 14:28:07

+0

'B有一个字典[A,double]' - 是'A_list'属性吗?如果是这样,这段代码就不会编译:'B.A_list.Where(a => rtn.Keys.Contains(a)' – GolfWolf 2013-02-18 14:30:50

+0

您能显示类“A','B'和'C'的定义吗? – GolfWolf 2013-02-18 14:33:30

回答

5

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

无论如何,你可以做到这一切在一个单一的LINQ声明三个步骤:使用SelectMany

  • 集团通过独特的一个

    1. 收起键值对使用GroupBy
    2. 以最大双重每使用的密钥ToDictionary

    其中cC的一个实例:

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

    你也可以在地方ToDictionary的使用ToLookup,这将产生一个IEnumerable迭代器在同一[A, double]元组由ToDictionary物化。

  • +1

    +1您不需要'SelectMany'中的Select(y => y)',但除此之外这正是我想出的与。 – juharr 2013-02-18 14:41:46

    +0

    @juharr好的一点,谢谢。 – 2013-02-18 14:42:51

    +0

    谢谢你,看起来像我之后 – MikeT 2013-02-18 14:58:43