字典上的linq查询问题<string,dictionary <string,=“”int =“”>&gt; </string,>

时间:2012-05-22 21:45:50

标签: c# .net linq

请考虑以下事项。 。

Dictionary<string, Dictionary<string, int>> myData;

我想只保留内部 int > 1的外部条目。

myData= myData.Select(c => c.Value.Where(i => i.Value > 1));

。 。 。抛出转换错误。

感谢。

修改

@Saeed给出的答案很棒,但是我现在还需要额外的东西。我需要外部Dictionary只包含内部Dictionary有多个条目的条目。 (每次我想我已经得到它,我没有。而且我确定我应该看到的东西!)

3 个答案:

答案 0 :(得分:5)

int大于1时没有外部字典,因为每个外部字典“包含”与内部字典中的整数一样多的整数。

如果您想保留外部字典,其中至少有一个int大于1:

myData.Select(d => d.Value.Any(p => p.Value > 1));

如果要保留所有int s大于1的外部词典:

myData.Select(d => d.Value.All(p => p.Value > 1));

答案 1 :(得分:3)

您应该将其强制转换为字典,也可以只使用匿名类型而不是其确切类型。

myData= myData
             .Select(c => new {Key = c.Key,
                           Value = c.Value
                           .Where(i => i.Value > 1)
                           .ToDictionary(y=>y.Key, y=>y.Value)})
             .ToDictionary(x=>x.Key, x=>x.Value);

更新:执行此操作后,请执行以下操作:

myData = myData.Where(x=>x.Value.Count() > 1).ToDictionary(x=>x.Key,x=>x.Value);

答案 2 :(得分:0)

如果您在浏览词典时遇到问题,可能要做的就是摆脱它们!

var flattened = 
  from kvp1 in myData
  let s1 = kvp1.Key
  from kvp2 in kvp1.Value
  let s2 = kvp2.Key
  let i = kvp2.Value
  select new { s1, s2, i };

现在有一个很好的扁平集合,您应该可以轻松地过滤到您想要的内容。