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

3

鉴于

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

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

"Green" => "Apples"

在我的特定用例中,子字符串将是全局唯一的(例如,不必担心绿色的葡萄柚),因此可以将映射设置为 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做到吗?

关于仅展开相同数据结构的问题非常类似。

使用Linq展开C#字典中的列表

但是,这不会保持与字典键的关系。

我查阅了有关SelectMany的很好的可视化教程(相关问题中使用的方法),但没有找到关联键的方法。

1个回答

6
听起来你想要:

声音像是你想要:

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

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

@EricJ:它仍然应该可以工作,但编辑后的版本应该会更清晰一些。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接