首页 > 解决方案 > C#/Linq - 按字符串数组中返回的第二项分组,同时保留父项

问题描述

我从 API 返回了以下数据,我正在尝试使用 linq 来重新塑造数据。实际上是否有可能做到这一点并获得以下预期结果。

  "results": [
    {
      "Description": "Describe1",
      "Cost": 5.00,
      "Category": [
        "Online",
        "Games"
      ]
    },
    {
      "Description": "Describe2",
      "Cost": 4.00,
      "Category": [
        "Online",
        "Games"
      ]
    },
    {
      "Description": "Describe3",
      "Cost": 3.00,
      "Category": [
        "Online",
        "Grocery"
      ]
    },
    {
      "Description": "Describe4",
      "Cost": 3.00,
      "Category": [
        "Transport",
        "Bus"
      ]
    },
    {
      "Description": "Describe5",
      "Cost": 3.00,
      "Category": [
        "Transport",
        "Bus"
      ]
    },
    {
      "Description": "Describe5",
      "Cost": 10.00,
      "Category": [
        "Transport",
        "Train"
      ]
    }
}

我试图从上面实现的最终输出:

{ name : "Online", 
    data: [
    {
        name: Games,
        value: 9.00
    },
    {
        name : Grocery,
        value: 3.00
    }],
 name : "Transport",
 data: [
    {
        name: Bus,
        value: 6.00
    },
    {
        name : Train,
        value: 10.00
    }],
}

按 FirstOrDefault 分组对于一级统计数据来说很容易,但我看不出从哪里开始分组!

提前致谢。

标签: c#linqgroup-by

解决方案


这应该有效:

class ResultItem {
    public string Name { get; set; }
    public double Value { get; set; }
}

class ResultGroup {
    public string Name { get; set; }
    public ResultItem[] Data { get; set; }
}

var results = items
    .GroupBy(x => x.Category[0])
    .Select(g => new ResultGroup {
        Name = g.Key,
        Data = g
            .GroupBy(x => x.Category[1])
            .Select(g2 => new ResultItem { Name = g2.Key, Value = g2.Sum(x => x.Cost) })
            .ToArray()
        });

推荐阅读