使用 linq 的 groupby 方法结合 select 投影,可以将分组后的数据直接转换为统计结果对象。具体做法是在 select 中实例化目标类,通过 g.key 获取分组键,并调用 g.count()、g.sum() 等聚合方法计算统计值,最终返回包含这些字段的对象列表。

如何按指定字段分组并统计数量?
按指定字段分组并统计数量的核心在于利用 GroupBy 对源数据进行分类,并在后续投影中应用计数函数。开发者只需传入分组键选择器,LINQ 便会自动将具有相同键的元素归入同一组,随后在 Select 阶段提取键值并计算每组的元素总数,从而生成包含分组依据和对应计数的统计对象。

using System;
using System.Collections.Generic;
using System.Linq;
public class Product
{
public string Category { get; set; }
public string Name { get; set; }
}
public class CategoryCount
{
public string CategoryName { get; set; }
public int Count { get; set; }
}
class Program
{
static void Main()
{
var products = new List<Product>
{
new Product { Category = "Electronics", Name = "Laptop" },
new Product { Category = "Electronics", Name = "Phone" },
new Product { Category = "Books", Name = "C# Guide" },
new Product { Category = "Books", Name = "Python Book" },
new Product { Category = "Books", Name = "Java Book" }
};
var stats = products
.GroupBy(p => p.Category)
.Select(g => new CategoryCount
{
CategoryName = g.Key,
Count = g.Count()
})
.ToList();
foreach (var stat in stats)
{
Console.WriteLine($"{stat.CategoryName}: {stat.Count}");
}
}
}
预期输出: Electronics: 2 Books: 3
如何在分组时同时计算总和与平均值?
在分组时同时计算总和与平均值,需要在 Select 投影中同时调用 Sum 和 Average 方法。这要求源数据中的数值属性可被访问,且目标统计对象需包含对应的求和字段与平均数字段,LINQ 会在遍历每组元素时分别累加数值并计算均值,最后将结果封装进新对象。

using System;
using System.Collections.Generic;
using System.Linq;
public class Sale
{
public string Region { get; set; }
public decimal Amount { get; set; }
}
public class RegionStats
{
public string RegionName { get; set; }
public decimal TotalAmount { get; set; }
public decimal AverageAmount { get; set; }
}
class Program
{
static void Main()
{
var sales = new List<Sale>
{
new Sale { Region = "North", Amount = 100m },
new Sale { Region = "North", Amount = 200m },
new Sale { Region = "South", Amount = 150m },
new Sale { Region = "South", Amount = 50m }
};
var regionStats = sales
.GroupBy(s => s.Region)
.Select(g => new RegionStats
{
RegionName = g.Key,
TotalAmount = g.Sum(s => s.Amount),
AverageAmount = g.Average(s => s.Amount)
})
.ToList();
foreach (var rs in regionStats)
{
Console.WriteLine($"{rs.RegionName} - Total: {rs.TotalAmount}, Avg: {rs.AverageAmount}");
}
}
}
预期输出: North - Total: 300, Avg: 150 South - Total: 200, Avg: 100
当分组键为 null 时统计结果如何处理?
当分组键为 null 时,LINQ 会将所有键值为 null 的元素归入同一组,该组的 Key 属性即为 null。在统计结果对象中,如果分组键字段是引用类型(如 string),则对应对象的分组键属性将为 null;如果是值类型(如 int?),则为 null 可空值。这种处理确保了 null 键不会导致异常,而是作为独立的一组进行统计。


















