C#LINQ-将嵌套字典转换为列表

C#LINQ-将嵌套字典转换为列表,c#,linq,C#,Linq,如何将嵌套字典展平为一些对象的列表(以下示例中为SomeObject),这些对象应该包含这些字典的键 例如:让我们有一本以下类型的字典 var nestedDictionary = new Dictionary<int, Dictionary<int, string>>(); 如何将nestedDictionary转换为List,其中var1是外部字典的键,var2是内部字典的键,someStringVar是内部字典的字符串值 从本质上讲,我该如何传递: nestedD

如何将嵌套字典展平为一些对象的列表(以下示例中为
SomeObject
),这些对象应该包含这些字典的键

例如:让我们有一本以下类型的字典

var nestedDictionary = new Dictionary<int, Dictionary<int, string>>();
如何将
nestedDictionary
转换为
List
,其中
var1
是外部字典的键,
var2
是内部字典的键,
someStringVar
是内部字典的字符串值

从本质上讲,我该如何传递:

nestedDict[0][0] = "foo";
nestedDict[0][1] = "bar";
nestedDict[0][2] = "foo1";
nestedDict[1][0] = "bar1";
nestedDict[1][1] = "foo2";
nestedDict[1][2] = "bar2";
对此(用伪C#表示,只是将其可视化)

使用LINQ?

应该可以:

var flattened =
from kvpOuter in nestedDictionary
from kvpInner in kvpOuter.Value
select new SomeObject()
{
    var1 = kvpOuter.Key,
    var2 = kvpInner.Key,
    someStringVar = kvpInner.Value
};
var list = flattened.ToList(); // if you need a list...
您可以使用和编写以下内容:

var objList = nestedDictionary.SelectMany(
    pair => pair.Value.Select(
        innerPair => new SomeObject() {
            var1 = pair.Key,
            var2 = innerPair.Key,
            someStringVar = innerPair.Value
        })).ToList();

这将为您提供一个可枚举的
IEnumerable


调用
results.ToList
results.ToArray
分别获取
列表
SomeObject[]

@TimSchmelter:太棒了!谢谢蒂姆:)看来我只是在和LINQ一起工作时倾向于将事情过度复杂化……我就是看不到这么简单的解决方案。谢谢:)谢谢!!!哇,我已经准备好把头撞到墙上了,但现在一切似乎都好了,我可以永远继续编码了!如果您只想将嵌套字典作为列表返回,那么如何使用LINQ实现这一点?没有对象初始值设定项?@JWiley:您是希望将每个嵌套字典转换为一个列表(从而最终获得一个列表列表),还是希望获得包含内部字典中所有键值的最终列表?您不能简单地从上面的代码中删除对象初始值设定项,您需要为每个内部字典元素(例如kvpInner)返回一些内容。+1
SelectMany是我倾向于使用查询语法的地方(如果可能的话),我不知道为什么。如果它的格式很好,那么方法语法也同样可读(在C语言中,与VB不同)。@Tim,这并不是说它有什么问题:)我实际上选择方法语法是因为最后的
ToList()
调用(出于某种原因,我不喜欢将查询语法与最后的方法调用混合使用)。
var xxx = nestedDictionary.SelectMany(
                    kvp =>
                    kvp.Value.Select(
                        xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));
var objList = nestedDictionary.SelectMany(
    pair => pair.Value.Select(
        innerPair => new SomeObject() {
            var1 = pair.Key,
            var2 = innerPair.Key,
            someStringVar = innerPair.Value
        })).ToList();
var results = from d in nestedDictionary
              from innerD in d.Value
              select new SomeObject { var1 = d.Key, var2 = innerD .Key, someStringVar = innerD .Value };
var xxx = nestedDictionary.SelectMany(
                    kvp =>
                    kvp.Value.Select(
                        xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));