التجميعات وToList
احسب العدد والمجموع وحوّل النتائج إلى قائمة
التجميعات وToList درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
عدّ العناصر
يعيد Count عدد العناصر في تسلسل. ومع استخدام دالة شرطية، يحسب العناصر المطابقة فقط.
يفرض هذا تعداد التسلسل، ولذلك يُمرَّر على التسلسل بأكمله لإنتاج الإجمالي، فهو عملية تجميعية.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));جمع القيم
يجمع Sum القيم الرقمية. فعلى تسلسل رقمي، يجمع العناصر، ومع وجود محدد، يجمع قيمة مستخرجة من كل عنصر.
يعيد النوع الرقمي نفسه لنوع المصدر أو لنتيجة المحدد.
using System;
using System.Linq;
using System.Collections.Generic;
record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);حساب المتوسط
يحسب Average المتوسط الحسابي. وكما هي الحال مع Sum، يقبل محددًا اختياريًا.
تكون النتيجة من نوع ذي فاصلة عائمة، مثل double، حتى عندما يكون المصدر مكوّنًا من أعداد صحيحة، فلا تُفقد الدقة أثناء القسمة.
using System;
using System.Linq;
int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);Min وMax
يعيد كل من Min وMax أصغر القيم وأكبرها. ومع وجود محدد، يختزلان مفتاحًا مستخرجًا.
في إصدارات .NET الحديثة، يعيد MaxBy وMinBy العنصر بأكمله ذي المفتاح الأقصى، وليس قيمة المفتاح فقط.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);مزالق التسلسلات الفارغة
في التسلسل الفارغ، تُلقي Average وMin وMax استثناء InvalidOperationException عند استخدامها مع أنواع القيم. أما Sum فيعيد صفرًا، ويعيد Count صفرًا أيضًا.
تحققوا باستخدام Any()، أو استخدموا DefaultIfEmpty قبل حساب متوسط بيانات قد تكون فارغة.
using System;
using System.Linq;
int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);Aggregate للاختزال المخصص
يختزل Aggregate تسلسلًا إلى قيمة واحدة باستخدام دالة تجميع. وهو الصيغة العامة التي تقوم عليها Sum وغيرها.
يمكنكم توفير قيمة ابتدائية ودمج كل عنصر في نتيجة تتراكم تدريجيًا، وهذا مفيد لحساب جداءات العناصر أو دمج النصوص أو تنفيذ منطق مخصص.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);تحويل النتائج إلى قائمة باستخدام ToList
ينفذ ToList الاستعلام فورًا وينسخ النتائج إلى List<T>. وبهذا يُوقِف التنفيذ المؤجل عمدًا.
استخدموه لأخذ لقطة ثابتة، أو لتجنب إعادة تشغيل مسار معالجة مكلف، أو للحصول على ميزات القوائم مثل الفهرسة وخاصية Count.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));ToArray وToDictionary
تشمل دوال تحويل النتائج ذات الصلة ToArray لإنشاء مصفوفة ذات حجم ثابت، وToDictionary لإجراء بحث قائم على المفتاح.
يأخذ ToDictionary محددًا للمفتاح، ومحددًا اختياريًا للقيمة، ويُلقي استثناءً إذا أنتج عنصران المفتاح نفسه.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);لماذا نحوّل النتائج إلى بنية فعلية
تُعاد الاستعلامات المؤجلة في كل مرة يتم فيها تعدادها. وإذا كان مسار المعالجة مكلفًا أو يقرأ مصدرًا متغيرًا، فإن هذا التكرار يؤدي إلى الأخطاء وبطء الأداء.
يؤدي استدعاء ToList مرة واحدة إلى حفظ النتائج، بحيث تصبح القراءات اللاحقة سريعة ومتسقة.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);First وSingle وAny
تفرض مشغلات العناصر التنفيذ أيضًا. يعيد First أول تطابق، ويلقي استثناءً إذا لم يجد أي تطابق، بينما يعيد FirstOrDefault قيمة افتراضية بدلًا من ذلك، ويتطلب Single وجود عنصر واحد بالضبط.
يخبركم Any ما إذا كان التسلسل يحتوي على أي عنصر مطابق، من دون تعداد جميع العناصر.
using System;
using System.Linq;
int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");مسار المعالجة الكامل
تجمع الاستعلامات الواقعية بين التصفية والإسقاط والفرز والتجميع، وغالبًا ما تنتهي بدالة لتحويل النتائج إلى بنية فعلية.
اقرؤوا الاستعلام من أعلى إلى أسفل: صفّوا العناصر، ثم شكّلوها، ثم رتّبوها، ثم اجمعوها. ينفذ ToList النهائي مسار المعالجة بأكمله مرة واحدة.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 9) };
var top = sales.Where(s => s.Amt > 4)
.OrderByDescending(s => s.Amt)
.Select(s => s.City)
.ToList();
Console.WriteLine(string.Join(", ", top));اختبار سريع
فكروا في التنفيذ المؤجل وتحويل النتائج إلى بنية فعلية.
مراجعة
تختزل الدوال التجميعية التسلسل إلى قيمة: Count وSum وAverage وMin/Max وMinBy/MaxBy، بالإضافة إلى Aggregate العام. تفرض هذه الدوال التنفيذ، وقد تلقي استثناءً عند التعامل مع مصادر فارغة.
تحوّل ToList وToArray وToDictionary النتائج إلى بنية فعلية، فتوقف التنفيذ المؤجل وتجعل مسار المعالجة المكلف يعمل مرة واحدة. وبهذا تكتمل مجموعة أدوات LINQ للتصفية والإسقاط.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «التجميعات وToList» مجاني؟
نعم — نص درس «التجميعات وToList» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «التجميعات وToList»؟
احسب العدد والمجموع وحوّل النتائج إلى قائمة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التجميعات وToList»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.