Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#/Linq-按字符串数组中返回的第二项分组,同时保留父项_C#_Linq_Group By - Fatal编程技术网

C#/Linq-按字符串数组中返回的第二项分组,同时保留父项

C#/Linq-按字符串数组中返回的第二项分组,同时保留父项,c#,linq,group-by,C#,Linq,Group By,我从API返回了以下数据,我正在尝试使用linq来重新塑造数据。 是否真的有可能做到这一点,并获得以下预期结果 "results": [ { "Description": "Describe1", "Cost": 5.00, "Category": [ "Online", "Games" ] }, { "Description": "Describe2", "Cos

我从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进行分组对于一级统计数据来说非常简单,但我不知道从何处开始进行子分组

提前感谢。

这应该可以:

类结果项{
公共字符串名称{get;set;}
公共双值{get;set;}
}
类ResultGroup{
公共字符串名称{get;set;}
public ResultItem[]数据{get;set;}
}
var结果=项目
.GroupBy(x=>x.Category[0])
.选择(g=>new ResultGroup{
名称=g.键,
数据=g
.GroupBy(x=>x.Category[1])
.Select(g2=>newresultitem{Name=g2.Key,Value=g2.Sum(x=>x.Cost)})
.ToArray()
});

您可以通过这种简单的方式实现,即现场演示


分两部分回答你的问题

第1部分

第一部分包括几个步骤

  • 将现有Json反序列化为自定义数据结构
  • 修改和创建新的数据结构
使用Linq可以实现上述步骤,如下所示

var parsedData = JsonConvert.DeserializeObject<RootObject>(str).Results.GroupBy(x=> x.Category.First())
        .Select(x=>
            new {
                 name= x.Key,
                 data =  x.GroupBy(c=>c.Category.Last())
                           .Select(c=> new {value=c.Sum(f=>f.Cost),name=c.Key})
                });
正如所观察到的,名称和数据字段在json中是重复的。如果您希望以这种特定的方式获得结果,则需要序列化在第1部分中接收的Json,并使用字符串操作对其进行修改。比如说,

var jsonCollection =  parsedData.Select(x=> Regex.Replace(JsonConvert.SerializeObject(x,Newtonsoft.Json.Formatting.Indented),@"^{|}$",string.Empty));
var finalResult = $"{{{string.Join(",",jsonCollection)}}}";
[
{ 
 name : "Online", 
 data: [....]
},
{
 name : "Transport",
 data: [...],
}
]
输出

{"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}]}
{
  "name": "Online",
  "data": [
    {
      "value": 9.0,
      "name": "Games"
    },
    {
      "value": 3.0,
      "name": "Grocery"
    }
  ]
,
  "name": "Transport",
  "data": [
    {
      "value": 6.0,
      "name": "Bus"
    },
    {
      "value": 10.0,
      "name": "Train"
    }
  ]
}
[
  {
    "name": "Online",
    "data": [
      {
        "value": 9.0,
        "name": "Games"
      },
      {
        "value": 3.0,
        "name": "Grocery"
      }
    ]
  },
  {
    "name": "Transport",
    "data": [
      {
        "value": 6.0,
        "name": "Bus"
      },
      {
        "value": 10.0,
        "name": "Train"
      }
    ]
  }
]
如果您想要的结果需要是一个有效的json,那么您可以确保它是一个数组。比如说,

var jsonCollection =  parsedData.Select(x=> Regex.Replace(JsonConvert.SerializeObject(x,Newtonsoft.Json.Formatting.Indented),@"^{|}$",string.Empty));
var finalResult = $"{{{string.Join(",",jsonCollection)}}}";
[
{ 
 name : "Online", 
 data: [....]
},
{
 name : "Transport",
 data: [...],
}
]
然后可以直接序列化在第1部分中得到的结果

var finalResult = JsonConvert.SerializeObject(parsedData, Newtonsoft.Json.Formatting.Indented);
输出

{"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}]}
{
  "name": "Online",
  "data": [
    {
      "value": 9.0,
      "name": "Games"
    },
    {
      "value": 3.0,
      "name": "Grocery"
    }
  ]
,
  "name": "Transport",
  "data": [
    {
      "value": 6.0,
      "name": "Bus"
    },
    {
      "value": 10.0,
      "name": "Train"
    }
  ]
}
[
  {
    "name": "Online",
    "data": [
      {
        "value": 9.0,
        "name": "Games"
      },
      {
        "value": 3.0,
        "name": "Grocery"
      }
    ]
  },
  {
    "name": "Transport",
    "data": [
      {
        "value": 6.0,
        "name": "Bus"
      },
      {
        "value": 10.0,
        "name": "Train"
      }
    ]
  }
]

在寻求帮助之前,展示自己的一些努力总是很好的。你能提到(或更新问题)你尝试了什么,你已经走了多远?这个问题太宽泛了。它可能有多个实现。不要认为您期望的Json结果是有效的。是的,有可能得到您期望的输出。您是否厌倦了代码中的任何内容?不可能生成您期望的无效json输出,因为它是无效的json。这是否回答了您的问题?如果您需要任何帮助@HarryWhat
ResultGroup
,请告诉我?什么是
ResultItem
?只是一些类来表示输出格式。我刚刚添加了代码。