使用Linq从列表字典创建映射

时间:2012-09-12 20:58:01

标签: linq linq-to-objects

给出

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

我希望创建一个从子项到父项的映射,例如

  

&#34;绿色&#34; =&GT; &#34;苹果&#34;

在我的特定用例中,子字符串将是全局唯一的(例如,无需担心绿色葡萄柚),因此映射可能是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(相关问题中使用的方法),但看不到与密钥相关的信息。

1 个答案:

答案 0 :(得分:4)

听起来像你想要的那样:

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

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