C#/Linq-按字符串数组中返回的第二项分组,同时保留父项
我从API返回了以下数据,我正在尝试使用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
"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反序列化为自定义数据结构
- 修改和创建新的数据结构
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
?只是一些类来表示输出格式。我刚刚添加了代码。