Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Aggregate() trong LINQ C#

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

OverloadMô tảVí dụ
Aggregate(func)Không seed, dùng phần tử đầu làm seednums.Aggregate((a,b) => a+b) (tổng)
Aggregate(seed, func)Có seed, không result selectornums.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 InvalidOperationException nế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).