Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将字典转换为值和键混合的列表?_C#_Linq_Dictionary - Fatal编程技术网

C# 如何将字典转换为值和键混合的列表?

C# 如何将字典转换为值和键混合的列表?,c#,linq,dictionary,C#,Linq,Dictionary,我有一些字典。让它成为: var dictionary = new Dictionary< string, List<MyClass>>(); var dictionary=newdictionary(); 我需要将其转换为包含键和值属性的对象列表。 我用foreach循环以下一种方式实现了这一点: var list = new List<dynamic>(); foreach (var key in dictionary.Keys) { var

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

var dictionary = new Dictionary< string, List<MyClass>>();
var dictionary=newdictionary();
我需要将其转换为包含键和值属性的对象列表。 我用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
        }
        );
    }
}
var list=newlist();
foreach(dictionary.Keys中的var键)
{
var值=字典[键];
foreach(值中的var obj)
{
列表。添加(新)
{
对象属性0,
对象属性1,
对象属性2,
...
钥匙
}
);
}
}

它起作用了,但对我来说很粗鲁。使用LINQ是否可以更优雅地执行此操作?

您可以使用
选择many
执行此操作

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
,则需要在
ToList()之前执行
Cast()
。另外,如果您希望匿名类的最后一个属性是
key
而不是
key
,则需要执行
key=kvp.key

可以显示
MyClass
的代码吗。我假设它实现了
IEnumerable
,因为您对
执行了
foreach
。事实上-一个简短但完整的示例会让这更容易帮助您。@juharr谢谢,我错过了MyClass的列表。如果您真的想要列表,请在最后打一个
.ToList()
。@MatthewWatson非常正确,修正了,很好的解决方案。这就是我正在寻找的。谢谢