في عالم LINQ، الـ Aggregate دي عبارة عن extension method قوية جدًا ومفيدة. وظيفتها الأساسية إنها بتسمحلك تطبّق عملية حسابية أو منطقية بشكل تراكمي على كل العناصر اللي في collection (زي List أو array) عشان في الآخر تطلع بقيمة واحدة نهائية.

فكر فيها كأنك معاك ليسته وعايز تعمل عليها عملية معينة خطوة بخطوة، وكل خطوة بتعتمد على نتيجة الخطوة اللي قبلها، لحد ما توصل للنتيجة النهائية.

بتشتغل إزاي؟

الـ Aggregate بتمشي على عناصر الـ collection واحد ورا التاني، ومع كل عنصر بتستخدم function انت اللي بتحددها عشان “تدمج” العنصر ده مع النتيجة اللي متجمعة لحد دلوقتي.

عشان تشتغل صح، غالبًا بتحتاج تحدد لها حاجتين أساسيتين:

  1. الـ seed (القيمة الأولية / البذرة): دي القيمة اللي العملية التراكمية بتبدأ بيها قبل ما تبص على أي عنصر في الـ collection.
    • لو بتجمع أرقام، الـ seed غالبًا بيكون 0.
    • لو بتضرب أرقام، الـ seed غالبًا بيكون 1.
    • لو بتلزق كلام (strings)، الـ seed غالبًا بيكون string فاضي "".
  2. الـ Accumulator Function (الفانكشن التراكمية): دي الـ function اللي بتطبق مع كل عنصر. الـ function دي بتاخد حاجتين:
    • القيمة اللي متجمعة لحد دلوقتي (Accumulated Value).
    • العنصر الحالي من الـ collection اللي عليه الدور. والـ function دي بترجع القيمة المتجمعة الجديدة بعد دمج العنصر الحالي.

الخطوات:

  1. تبدأ بالـ seed.
  2. تاخد أول عنصر، تطبق عليه الـ accumulator function (مع الـ seed)، وتطلع بنتيجة جديدة.
  3. تاخد تاني عنصر، تطبق عليه الـ accumulator function (مع النتيجة الجديدة اللي طلعت من الخطوة 2)، وتطلع بنتيجة أجدد.
  4. وهكذا… لحد ما تخلص كل العناصر.
  5. آخر نتيجة بتوصلها هي دي القيمة النهائية اللي بترجعهالك الـ Aggregate.

مثال 1: جمع أرقام ليسته

تخيل عندك ليسته أرقام وعايز تجمعهم باستخدام Aggregate:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
 
// Use Aggregate to sum the numbers
// Seed is 0 (starting point for sum)
// The function takes the current total and the next number, returns their sum
int sum = numbers.Aggregate(0, (currentTotal, nextNumber) => currentTotal + nextNumber);
 
Console.WriteLine($"The sum is: {sum}"); // Output: The sum is: 15
  • إيه اللي حصل؟
    • بدأنا بـ seed = 0.
    • (0, 1) 0 + 1 = 1
    • (1, 2) 1 + 2 = 3
    • (3, 3) 3 + 3 = 6
    • (6, 4) 6 + 4 = 10
    • (10, 5) 10 + 5 = 15 (النتيجة النهائية)

مثال 2: تجميع ليسته حروف في كلمة واحدة

List<string> letters = new List<string> { "S", "A", "L", "M", "A" };
 
// Use Aggregate to concatenate strings
// Seed is "" (empty string)
// The function takes the accumulated string and the next letter, returns the combined string
string word = letters.Aggregate("", (currentWord, nextLetter) => currentWord + nextLetter);
 
Console.WriteLine($"The word is: {word}"); // Output: The word is: SALMA

مثال 3: إيجاد أطول كلمة في ليسته

ممكن نستخدمها في حاجات أعقد شوية، زي إنك تلاقي أطول كلمة في ليسته كلمات:

List<string> words = new List<string> { "Mahmoud", "Corn", "Test", "Pop" };
 
// Seed is an empty string (or the first word if you handle empty list case)
// The function compares the longest word found so far with the next word
string longestWord = words.Aggregate("", (longestSoFar, nextWord) =>
                                        nextWord.Length > longestSoFar.Length ? nextWord : longestSoFar);
 
Console.WriteLine($"Longest word is: {longestWord}"); // Output: Longest word is: Mahmoud

بنستخدم Aggregate امتى؟

  • لما تكون عايز تعمل عملية تجميعية أو تراكمية معقدة شوية على ليسته، ومش لاقيلها function جاهزة ومباشرة في LINQ زي Sum(), Count(), Average(), Max(), Min().
  • لما النتيجة النهائية اللي عايز توصلها بتعتمد على دمج العناصر خطوة بخطوة بناءً على منطق معين أنت بتحدده.
  • تجميع بيانات بطريقة معينة، بناء string معقد، إجراء حسابات متتالية.

ملحوظة: لو العملية اللي عايز تعملها بسيطة وموجود لها function جاهزة في LINQ (زي Sum, Max…)، استخدم الجاهزة دي بتكون أوضح وأسهل في القراية. Aggregate قوتها في مرونتها للعمليات المخصصة (custom logic).


يارب يكون الشرح ده وضّحلك يعني إيه Aggregate في LINQ وإزاي بنستخدمها. لو فيه أي استفسار تاني، أنا معاك!