Phương thức Aggregate() áp dụng một hàm tích lũy (accumulator function) lên các phần tử của chuỗi để tính toán một kết quả duy nhất. Đây là dạng tổng quát của các phép fold/reduce.
Cú pháp cơ bản
TResult Aggregate(
TResult seed,
Func func,
Func resultSelector = null);
Ví dụ: Tìm chuỗi dài nhất (so với seed "DemoFive")
string[] arr = { "DemoOne", "DemoTwo", "DemoThree", "DemoFour" };
string res = arr.AsQueryable().Aggregate(
"DemoFive", // seed (giá trị khởi tạo)
(longest, next) => next.Length > longest.Length ? next : longest, // accumulator
str => str.ToLower() // result selector
);
// Kết quả: "demothree" (chữ thường, dài nhất)
Mã nguồn hoàn chỉnh
using System;
using System.Linq;
class Demo
{
static void Main()
{
string[] arr = { "DemoOne", "DemoTwo", "DemoThree", "DemoFour" };
string res = arr.AsQueryable().Aggregate(
"DemoFive",
(longest, next) => next.Length > longest.Length ? next : longest,
str => str.ToLower());
Console.WriteLine("Chuỗi dài nhất (so với seed): {0}", res);
}
}
Kết quả
Chuỗi dài nhất (so với seed): demothree
Các dạng Aggregate
| Overload | Mô tả | Ví dụ |
|---|---|---|
Aggregate(func) | Không seed, dùng phần tử đầu làm seed | nums.Aggregate((a,b) => a+b) (tổng) |
Aggregate(seed, func) | Có seed, không result selector | nums.Aggregate(0, (a,b) => a+b) |
Aggregate(seed, func, selector) | Đầy đủ | Ví dụ trên |
Ứng dụng phổ biến
- Tổng, tích:
seed=0, (a,b)=>a+b/seed=1, (a,b)=>a*b - Ghép chuỗi:
seed="", (a,b)=>a+","+b(cần xử lý dấu phẩy đầu) - Tìm max/min tùy chỉnh
- Xây dựng object phức tạp từ chuỗi
Lưu ý
- Ném
InvalidOperationExceptionnếu chuỗi rỗng và không có seed. - Seed được dùng làm giá trị khởi tạo cho accumulator.
- Result selector cho phép biến đổi kết quả cuối cùng (ví dụ: ToLower).