跳转到内容

C Sharp LINQ 聚合

来自代码酷

C# LINQ聚合[编辑 | 编辑源代码]

LINQ聚合(Aggregation)是C#语言集成查询(LINQ)中的一组强大操作,用于对数据序列执行计算并返回单个结果。这些操作包括求和、平均值、最大值、最小值、计数等,以及更复杂的自定义聚合。聚合操作是数据处理中的核心功能,特别适用于统计分析和数据汇总场景。

基础聚合操作[编辑 | 编辑源代码]

LINQ提供了一系列内置聚合方法,这些方法可以直接应用于实现了IEnumerable<T>接口的集合。

常用聚合方法[编辑 | 编辑源代码]

  • Count() - 计算序列中元素的数量
  • Sum() - 计算数值序列的总和
  • Average() - 计算数值序列的平均值
  • Max() - 查找序列中的最大值
  • Min() - 查找序列中的最小值
  • Aggregate() - 执行自定义聚合操作

代码示例[编辑 | 编辑源代码]

以下示例展示基本聚合操作:

int[] numbers = { 1, 2, 3, 4, 5 };

// 计数
int count = numbers.Count(); // 返回5

// 求和
int sum = numbers.Sum(); // 返回15

// 平均值
double average = numbers.Average(); // 返回3

// 最大值
int max = numbers.Max(); // 返回5

// 最小值
int min = numbers.Min(); // 返回1

高级聚合:Aggregate方法[编辑 | 编辑源代码]

Aggregate()方法是LINQ中最灵活的聚合操作,允许开发者定义自己的聚合逻辑。其基本形式为:

TResultAggregate<TSource,TResult>(IEnumerable<TSource>source,TResultseed,Func<TResult,TSource,TResult>func)

Aggregate工作原理[编辑 | 编辑源代码]

1. 接受一个初始值(种子) 2. 对序列中的每个元素应用聚合函数 3. 返回最终聚合结果

graph LR A[初始值/种子] --> B[第一个元素] B --> C[第一个结果] C --> D[第二个元素] D --> E[第二个结果] E --> F[...] F --> G[最终结果]

代码示例[编辑 | 编辑源代码]

计算数字乘积:

int[] numbers = { 1, 2, 3, 4, 5 };

// 使用Aggregate计算乘积
int product = numbers.Aggregate(1, (acc, num) => acc * num);

// 分解步骤:
// 初始值: 1
// 1 * 1 = 1
// 1 * 2 = 2
// 2 * 3 = 6
// 6 * 4 = 24
// 24 * 5 = 120
// 最终结果: 120

字符串连接示例:

string[] words = { "Hello", "World", "LINQ", "Aggregation" };

string combined = words.Aggregate((current, next) => current + " " + next);
// 结果: "Hello World LINQ Aggregation"

实际应用案例[编辑 | 编辑源代码]

案例1:电商订单统计[编辑 | 编辑源代码]

假设有一个订单列表,我们需要计算总销售额、平均订单金额和最大订单金额:

public class Order
{
    public int OrderId { get; set; }
    public decimal Amount { get; set; }
}

List<Order> orders = new List<Order>
{
    new Order { OrderId = 1, Amount = 100.50m },
    new Order { OrderId = 2, Amount = 75.25m },
    new Order { OrderId = 3, Amount = 150.00m }
};

// 总销售额
decimal totalSales = orders.Sum(o => o.Amount);

// 平均订单金额
decimal averageOrder = orders.Average(o => o.Amount);

// 最大订单金额
decimal maxOrder = orders.Max(o => o.Amount);

案例2:学生成绩分析[编辑 | 编辑源代码]

分析学生成绩数据,找出最高分、最低分和平均分:

var studentScores = new[]
{
    new { Name = "Alice", Score = 85 },
    new { Name = "Bob", Score = 92 },
    new { Name = "Charlie", Score = 78 }
};

var analysis = new
{
    HighestScore = studentScores.Max(s => s.Score),
    LowestScore = studentScores.Min(s => s.Score),
    AverageScore = studentScores.Average(s => s.Score)
};

性能考虑[编辑 | 编辑源代码]

  • 聚合操作通常是延迟执行的(除了返回标量值的方法)
  • 对于大型数据集,考虑使用并行LINQ(PLINQ)来提高性能
  • 复杂的自定义聚合可能影响性能,应进行测试

总结[编辑 | 编辑源代码]

LINQ聚合操作提供了强大的数据汇总和分析能力:

  • 内置聚合方法简单易用
  • Aggregate()方法支持复杂自定义逻辑
  • 适用于各种数据统计和分析场景
  • 可以与LINQ的其他操作(如Where、Select等)组合使用

掌握LINQ聚合操作可以显著提高数据处理效率和代码可读性,是C#开发者必备的技能之一。