扩展IDictionary <key,ienumerable <value =“”>&gt; </key,>

时间:2014-01-16 13:04:46

标签: c# linq lambda

我目前有一个Dictionary<Key, IEnumerable<Value>>,我想扩展它,因此它会成为Dictionary<Key, Value>

使用简单的foreach循环执行此操作很简单,但也很麻烦:

var result = new List<KeyValuePair<Key, Value>>();
foreach(var kvp in dict)
{
    foreach(var v in kvp.Value)
    {
        result.Add(new KeyValuePair<Key, Value>(kvp.Key, v));
    }
}

现在我想将它转换为单个LINQ查询,最好使用lambda语法。 (目前在项目中没有使用表达式语法 where ,并且现在不想开始)

3 个答案:

答案 0 :(得分:3)

您不能两次添加相同的密钥,但这会在嵌套循环中发生。

如果您想将其展平为评论为IEnumerable<KeyValuePair<Key, Value>>,则可以使用SelectMany

var dict = new Dictionary<string, IEnumerable<string>>();
IEnumerable<KeyValuePair<string, string>> flattenedDict = dict
    .SelectMany(kv => 
        kv.Value.Select(v => new KeyValuePair<string, string>(kv.Key, v)));

答案 1 :(得分:1)

如何使用LINQ inline:

var results = (from kvp in dict
                 from v in kvp.Value 
                 select new KeyValuePair<AddressType, ContractType>(kvp.Key, v))
                 .ToList();
但是,不知道lambda语法。

答案 2 :(得分:0)

您可以使用Lookup<T>,因为它支持每个值的多个键,

var dict = new Dictionary<string, IEnumerable<string>>();
var lookUp = dictionary
    .SelectMany(pair => pair.Value
        .Select(value => new { Key = pair.Key, Value = value }))
    .ToLookup(pair => pair.Key, pair => pair.Value);