2012-09-12 102 views
2

解释鉴于从字典创建映射使用LINQ

Dictionary<string, List<string>> myDict = new Dictionary<string, List<string>>() 
{ 
    "Apples", new List<string>() { "Green", "Red" }, 
    "Grapefruits", new List<string>() { "Sweet", "Tart" }, 
} 

的我希望创建从孩子的映射到父,例如

“绿色” =>“苹果”

在我的具体使用情况,孩子字符串将是全球唯一的(例如,没有绿柚子担心),这样的映射可能是一个Dictionary<string,string>

通过按照惯例重复myDict来完成这项工作相当简单。

Dictionary<string, string> map = new Dictionary<string,string>(); 
foreach (KeyValuePair<string, List<string>> kvp in myDict) 
{ 
    foreach (string name in kvp.Value) 
    { 
     map.Add(name, kvp.Key); 
    } 
} 

这可以用Linq来完成吗?

有大约只是压扁相同的数据结构

Flatten a C# Dictionary of Lists with Linq

然而,并不维持到字典中键的关系非常类似的问题。

我回顾了一个nice visual tutorial on SelectMany(在相关问题中使用的方法),但看不到关联密钥的方法。

回答

3

听起来像是你想:

var query = myDict.SelectMany(pair => pair.Value, 
           (pair, v) => new { Key = v, Value = pair.Key }) 
        .ToDictionary(pair => pair.Key, pair => pair.Value); 

注意,第二个参数SelectMany这里看起来有点奇怪这里,因为键成为最终的字典中的值,反之亦然。

+0

我在编辑之前感到困惑:-) –

+0

@EricJ .:它应该仍然有效,但编辑后的版本应该稍微清晰。 –

+0

我说我很困惑,不是你错了:-D –