使用单个查询的 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
我建议使用 命名元组 来操作 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)
作为 最终结果 ,但它也可能 return GeoStatsModel
:
...
.Select(group => new GeoStatsModel() {
Id = group.Key.id,
Name = group.Key.name,
Count = group.Sum()
});
我代表一个国家/地区计数的模型如下所示
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)
作为 最终结果 ,但它也可能 return GeoStatsModel
:
...
.Select(group => new GeoStatsModel() {
Id = group.Key.id,
Name = group.Key.name,
Count = group.Sum()
});