[英]LINQ Sub group results with a single query
我的 model 代表一个国家的计数如下
public class GeoStatsModel
{
public int Id { get; set; } // Country Id
public string Name { get; set; } //Country Name
public int Count { get; set; }
}
一些示例结果如下所示
List<GeoStatsModel> response;
14 UNITED STATES : 6668
23 CANADA : 768
3 MEXICO : 83
4 PUERTO RICO : 19
35 ISRAEL : 1
46 ECUADOR : 1
57 GERMANY : 3
68 NETHERLANDS : 2
9 COSTA RICA : 1
我们可以用 2 个 id 的结果从这个列表中进一步过滤吗
14 UNITED STATES : 6668
23 CANADA : 768
0 Others : [ Sum of Count from all other conuntries]
国家 ID 14 和 23 的值是不变的,不会改变
我可以将所有其他国家的总和作为
List<int> knownCountries = new List<int> { 14, 13 };
int sum_others = response.Where(g => !knownCountries.Contains(g.Id)).Select(g=>g.Count).Sum();
同样我可以找到
int sum_US=.
int sum_Canada=..
但是我们可以用任何方式将其编写为 linq 查询以将结果组合在单个 go 中
我建议使用命名元组来处理Id
、 Name
和Count
List<GeoStatsModel> response =
...
var result = response
.Select(item => (
id : knownCountries.Contains(item.Id) ? item.Id : 0,
name : knownCountries.Contains(item.Id) ? item.Name : "Others",
value : item.Count
))
.GroupBy(item => (id : item.id, name : item.name),
item => item.value)
.Select(group => (
id : group.Key.id,
name : group.Key.name,
count : group.Sum()
));
让我们看看result
:
string report = string.Join(Environment.NewLine, result
.Select(item => $"{item.id} {item.name} : {item.count}")
);
Console.Write(report);
我使用元组(int id, string name, int count)
作为最终结果,但也可以返回GeoStatsModel
:
...
.Select(group => new GeoStatsModel() {
Id = group.Key.id,
Name = group.Key.name,
Count = group.Sum()
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.