【问题标题】:C# LINQ - convert nested dictionary to a listC# LINQ - 将嵌套字典转换为列表
【发布时间】:2012-07-13 09:42:55
【问题描述】:

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

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

var nestedDictionary = new Dictionary<int, Dictionary<int, string>>();

那么,让我们来上课

public class SomeObject
{
   public int var1;
   public int var2;
   public string someStringVar;
}

如何将nestedDictionary 转换为List&lt;SomeObject&gt;,其中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# 中只是为了可视化它)

objList[0] = SomeObject { var1 = 0, var2 = 0, someStringVar = "foo" }
objList[1] = SomeObject { var1 = 0, var2 = 1, someStringVar = "bar" }
objList[2] = SomeObject { var1 = 0, var2 = 2, someStringVar = "foo1" }
objList[3] = SomeObject { var1 = 1, var2 = 0, someStringVar = "bar1" }
objList[4] = SomeObject { var1 = 1, var2 = 1, someStringVar = "foo2" }
objList[5] = SomeObject { var1 = 1, var2 = 2, someStringVar = "bar2" }

使用 LINQ?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以使用SelectMany() 并编写如下内容:

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

    【讨论】:

    • +1 SelectMany 是我倾向于使用查询语法的地方(如果可能的话),不知道为什么。如果它的格式很好,方法语法同样可读(在 C# 中不像 VB)。
    • @Tim,并不是说它有什么问题 :) 我实际上选择了方法语法,因为最后的 ToList() 调用(我不喜欢将查询语法与最终方法调用混合某种原因)。
    【解决方案2】:

    这应该可行:

    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...
    

    【讨论】:

    • @TimSchmelter:太好了!谢谢蒂姆:)
    • 似乎我只是在使用 LINQ 时倾向于使事情过于复杂......我只是无法看到如此简单的解决方案。谢谢:)
    • 谢谢!!!哇,我已经准备好用头撞墙了,但现在一切似乎都很好,我可以永远继续编码!
    • 如果您只想将嵌套字典作为列表返回,您将如何使用 LINQ 执行此操作?没有对象初始化器?
    • @JWiley:你是想把每个嵌套字典变成一个列表(所以最终得到一个列表列表),还是你想得到一个包含内部字典中所有键值的最终列表?您不能简单地从上面的代码中删除对象初始化器,您需要为每个内部字典元素(例如 kvpInner)返回一些内容...
    【解决方案3】:

    这将为您提供IEnumerable&lt;SomeObject&gt; 的枚举:

    var results = from d in nestedDictionary
                  from innerD in d.Value
                  select new SomeObject { var1 = d.Key, var2 = innerD .Key, someStringVar = innerD .Value };
    

    致电results.ToListresults.ToArray 分别获取List&lt;SomeObject&gt;SomeObject[]

    【讨论】:

      【解决方案4】:
      var xxx = nestedDictionary.SelectMany(
                          kvp =>
                          kvp.Value.Select(
                              xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));
      

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2017-07-29
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多