如何通过混合值和键将Dictionary转换为List?

时间:2015-11-12 13:17:11

标签: c# linq dictionary

我有一些字典。让它成为:

var dictionary = new Dictionary< string, List<MyClass>>();

我需要将它转换为包含key和value属性的对象列表。 我用下一个方式用foreach循环做到了:

var list = new List<dynamic>();
foreach (var key in dictionary.Keys)
{
    var values = dictionary[key];

    foreach (var obj in values)
    {
        list.Add(new
        {
            obj.Property0,
            obj.Property1,
            obj.Property2,
            ...
            key
        }
        );
    }
}

它有效,但对我来说看起来很粗鲁。是否可以使用LINQ更优雅地完成它?

1 个答案:

答案 0 :(得分:8)

您可以使用SelectMany执行此操作。

var list = dictionary.SelectMany(
        kvp => kvp.Value, 
        (kvp,obj) => new {obj.Property0, obj.Property1, obj.Property2, kvp.Key})
    .ToList();

或者在查询snytax

var list = (from kvp in dictionary
           from obj in kvp.Value
           select new {obj.Property0, obj.Property1, obj.Property2, kvp.Key})
    .ToList();

请注意,这会产生一个匿名类的列表。如果您真的需要dynamic,则需要在Cast<dynamic>()之前执行ToList()。此外,如果您希望匿名类的最后一个属性为key而不是Key,则您需要key = kvp.Key