我目前有一个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 ,并且现在不想开始)
答案 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);