使用列表和字典 c# 对象到元组

object to Tuple with list and dictionary c#

{
  "data": [
    {
      "id": 10,
      "title": "Administration",
      "active": true,
      "type": {
        "id": 2,
        "name": "Manager"
      }
    },
    {
      "id": 207,
      "title": "MCO - Exact Match 1",
      "active": true,
      "type": {
        "id": 128,
        "name": "Group"
      }
    },
    {
      "id": 1201,
      "title": "Regression",
      "active": false,
      "type": {
        "id": 2,
        "name": "Manager"
      }
    }
  ]
}

我正在尝试使用 linq 创建以下格式的元组。不确定如何从 group/aggregate 开始。任何帮助表示赞赏。我浏览了几个线程,但找不到与此类似的内容。

var tuple = new List<Tuple<int, List<Dictionary<int,bool>>>();
                              2                10, true    
                                               1201, false
                              128              207,  true

这是一个完整的工作代码:

        var o = new {
            data = new [] {
                new {
                    id = 10,
                    title = "Administration",
                    active = true,
                    type = new {
                        id = 2,
                        name = "Manager"
                    }
                },
                new {
                    id = 207,
                    title = "MCO - Exact Match 1",
                    active = true,
                    type = new {
                        id = 128,
                        name = "Group"
                    }
                },
                new {
                    id = 1201,
                    title = "Regression",
                    active = false,
                    type = new {
                        id = 2,
                        name = "Manager"
                    }
                }               
            }
        };

        var result = o.data.GroupBy(
            item => item.type.id, // the group key
            item => new Dictionary<int, bool>() {{ item.id, item.active }}, // the transformed elements in the group
            (id, items) => new Tuple<int, List<Dictionary<int, bool>>>(id, items.ToList()) // transformation of grouping result to the final desired format
        ).ToList();

        // check correctness
        foreach (var entry in result) {
            Console.Write(entry.Item1);
            foreach (var dict in entry.Item2) {
                foreach (var kvp in dict)
                    Console.WriteLine("\t\t" + kvp.Key + "\t" + kvp.Value);
            }
        }

这就是它的工作原理:

  • o 是数据模型,使用匿名类型表示。如果您已经拥有强类型模型,您显然可以在这里使用它;
  • o 我们应用了 GroupBy 的四参数版本,在 official docs from Microsoft 中有详细描述。基本上:
    • 第一个 lambda 表达式选择组键;
    • 第二个 lambda 定义属于每个组的元素;
    • 第三个lambda将each(组键,组元素枚举)转换成Tuple<int, List<Dictionary<int, bool>>>格式;
    • 最后我们调用 ToList() 来计算结果并将其存储为元组列表。
  • 最后一部分打印结果(没有花太多时间美化它,但它完成了验证代码的工作)。