如何使用LINQ从多个对象中提取属性

时间:2015-06-26 12:03:47

标签: c# linq

我经常发现自己在下面从对象列表中提取属性只是为了创建一个聚合列表。如何用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;

3 个答案:

答案 0 :(得分:2)

您可以使用SelectManyToDictionary方法:

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 );