使用单个查询的 LINQ 子组结果

LINQ Sub group results with a single query

我代表一个国家/地区计数的模型如下所示

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

我建议使用 命名元组 来操作 IdNameCount

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) 作为 最终结果 ,但它也可能 return GeoStatsModel:

  ...

  .Select(group => new GeoStatsModel() {
     Id    = group.Key.id,
     Name  = group.Key.name,
     Count = group.Sum()
   });