2014-02-11 26 views
0

我对C#转换工作的字典查询:如何在C#LINQ将字典转换为查询后重新组织键?

public class myClass 
{ 
    public int my_id; 
    public Dictionary<string, Dictionary<string, string[]>> myDict; 
} 

Dictionary<string, myClass> dataDict; 


var queryDict = (from happen in dataDict 
     group happen by happen.Value.my_id into g select g) 
     .ToDictionary(g => g.Key, g => g.ToDictionary(x => x.Key, x => x.Value)); 

我需要循环的QueryDict的每一个元素。

在进行查询之前,对于相同的dataDict键,可能有多个myClass具有相同的event_id。

查询后,对于相同的happen.Value.my_id,dataDict的原始键是如何组织的?他们是一个event_id指向的列表?

任何帮助,将不胜感激!

回答

1

基本上group by给你一个IGrouping<TKey, TElement>其是IEnumerable<TElement>IGrouping Interface),所以具有以下查询:

from happen in dataDict group happen by happen.Value.my_id into g select g 

手段,则组由happen.Value.my_id,所以TKeymy_idTElement将是一个KeyValuePair<string, MyClass>>这是你的字典的项目。由于上述查询的结果IGrouping<int, KeyValuePait<stirng, MyClass>>实际上是IEnumerable<keyValuePair<string, MyClass>>,所以对于每个密钥,实际上都有一个IEnumerable<KeyValuePair<string, MyClass>>。正如你在这里看到的那样,你的字典中的元素就像它们一样。 查询的第二部分只是将IEnumerable<IGrouping<int, Dictionary<string, MyClass>>>转换为Dictionary<int, Dictionary<string, MyClass>>>,所以没什么大不了的。

1

实际上,您的dataDict是一个KeyValuePair(1维数组)的数组。并且您的查询添加了另一个维度,因此它变成DictionariesDictionary。但是增加另一个维度只是一个新密钥的一组旧元素。

这是更好地说明它是这样的: enter image description here

+0

所以分组查询后,一个键可以与列表(或数组)的字典相关联?谢谢 !例如,<1,,>,它使用“1”作为键,我可以得到一个字典列表,对不对?如何访问相关的? – user2420472