我经常发现自己在下面从对象列表中提取属性只是为了创建一个聚合列表。如何用LINQ表达?
var totalErrors =
new Dictionary<string, string>();
foreach (var res in results)
{
foreach (var err in res.Errors)
{
totalErrors
.Add(err.Key, err.Value);
}
}
return totalErrors;
答案 0 :(得分:2)
您可以使用SelectMany
和ToDictionary
方法:
var result = results
.SelectMany(x => x.Errors) // get all Errors in one sequence
.ToDictionary(x => x.Key, x => x.Value); // create new dictionary based on this Enumerable
SelectMany()
将序列的每个元素投影到IEnumerable<T>
,并将生成的序列展平为一个序列。 ToDictionary()
根据指定的键选择器函数从Dictionary<TKey, TValue>
创建IEnumerable<T>
。
答案 1 :(得分:1)
您可以使用SelectMany
在两个级别上进行聚合,如下所示:
var totalErrors = results
.SelectMany(r => r.Errors)
.ToDictionary(e => e.Key, e => e.Value);
SelectMany
将一系列集合“展平”为一个级别,此时您可以将ToDictionary
应用于展平列表。
答案 2 :(得分:0)
您可以使用SelectMany:
var allErrors = Results.SelectMany( res=>res.Errors );
//foreach( var error in allErrors )...
var dictionary = allErrors.ToDictionary( x=>x.Key, x=> x.Value );