在C#LINQ将字典转换为查询后如何重组键?

时间:2014-02-11 05:16:10

标签: c# linq dictionary

我正在研究C#转换字典以进行查询:

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指向的列表?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分: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分组,因此TKey将为my_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 :(得分:1)

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

最好这样说明一下: enter image description here