我有一些字典。让它成为:
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更优雅地完成它?
答案 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
。