الترتيب والتجميع باستخدام OrderBy
رتّب النتائج وجمّعها
الترتيب والتجميع باستخدام OrderBy درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
الترتيب باستخدام OrderBy
يرتب OrderBy التسلسل تصاعديًا وفق مفتاح تختارونه. وتُرجع lambda القيمة التي سيجري الترتيب بناءً عليها.
يُرجع هذا العامل تسلسلًا جديدًا مرتبًا، وهو مستقر؛ أي إن العناصر ذات المفاتيح المتساوية تحافظ على ترتيبها النسبي الأصلي.
using System;
using System.Linq;
int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));ترتيب تنازلي
يرتب OrderByDescending العناصر من الأكبر إلى الأصغر وفق المفتاح المحدد.
استخدموه مباشرةً بدلًا من الترتيب تصاعديًا ثم عكس النتيجة؛ فهو يعبّر عن القصد بوضوح وينفذ الترتيب في مرور واحد.
using System;
using System.Linq;
int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));الترتيب وفق خاصية
بالنسبة إلى الكائنات، اختاروا الخاصية التي تريدون الترتيب وفقًا لها. يرتب OrderBy(p => p.Age) الأشخاص من الأصغر سنًا إلى الأكبر.
يمكن أن يكون المفتاح أي نوع قابل للمقارنة — مثل الأرقام والسلاسل النصية والتواريخ — أو أي نوع يطبق IComparable.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);الفرز الثانوي باستخدام ThenBy
يضيف ThenBy معيارًا لكسر التعادل. بعد OrderBy، يفرز العناصر التي تشترك في المفتاح الأساسي باستخدام مفتاح ثانٍ.
يمكنكم تسلسل عدة استدعاءات لـ ThenBy/ThenByDescending لإنشاء ترتيب متعدد المستويات.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");لماذا لا نستخدم OrderBy ثانيةً
إن استدعاء OrderBy مرتين لا يضيف معيارًا لكسر التعادل، بل يعيد الاستدعاء الثاني الفرز بالكامل ويتجاهل الترتيب الأول.
لإجراء فرز متعدد المستويات، استخدموا دائمًا ThenBy بعد استدعاء OrderBy الأول.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);عبارة orderby في صياغة الاستعلام
تتضمن صياغة الاستعلام عبارة orderby. أدرجوا مفاتيح متعددة يفصل بينها بفواصل، ويمكنكم إضافة descending اختياريًا.
يفرز orderby p.Age, p.Name descending حسب العمر، ثم حسب الاسم بترتيب عكسي عند التعادل.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));التجميع باستخدام GroupBy
يقسم GroupBy تسلسلًا إلى مجموعات تشترك في مفتاح. ويعيد تسلسلًا من IGrouping<TKey, TElement>.
تكشف كل مجموعة عن Key الخاص بها، وهي نفسها قابلة للتعداد على العناصر الموجودة فيها.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");مفتاح المجموعة وأعضاؤها
يحدد Key الخاص بكل مجموعة القسم الذي تنتمي إليه، ويؤدي التعداد على المجموعة إلى إرجاع أعضائها. ويمكنكم استدعاء Count() مباشرةً على المجموعة.
تُستخدم هذه الطريقة لإنشاء المدرجات التكرارية، والإحصاءات التجميعية، وتقسيم البيانات حسب الفئات.
using System;
using System.Linq;
string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
Console.WriteLine($"{g.Key}: {g.Count()}");التجميع ثم الإسقاط
من الأنماط الشائعة إسقاط كل مجموعة إلى كائن ملخص باستخدام Select بعد GroupBy.
تقرأون Key وتجمعون الأعضاء، مثل حساب عدد العناصر أو مجموعها لكل مجموعة.
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", 2) };
var totals = sales.GroupBy(s => s.City)
.Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");التجميع باستخدام محدد العناصر
يتضمن GroupBy إصدارًا يأخذ دالة lambda ثانية، وهي محدد العناصر، لتحديد ما تخزنه كل مجموعة، وليس مفتاح التجميع فقط.
نجمع هنا حسب المدينة، لكننا نخزن المبالغ فقط.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");الفرز والتجميع باستخدام التنفيذ المؤجل
يستخدم كل من OrderBy وGroupBy التنفيذ المؤجل، أي إنهما يعملان عند تعداد النتائج. لكن لاحظوا أن الفرز والتجميع يحتاجان إلى استهلاك المصدر كاملًا لإنتاج العنصر الأول.
لذلك، بخلاف Where، لا يعملان بأسلوب التدفق؛ فتظهر التكلفة عند التعداد الأول.
using System;
using System.Linq;
int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));اختبار سريع
فكروا في الفرز متعدد المستويات.
مراجعة
يفرز OrderBy/OrderByDescending حسب مفتاح، ويضيف ThenBy معايير لكسر التعادل. أما استدعاء OrderBy ثانٍ فيعيد الفرز، ولا يُعد معيارًا لكسر التعادل.
يقسم GroupBy العناصر إلى كائنات IGrouping تحتوي على Key وأعضاء، وغالبًا ما تُسقط إلى ملخصات. كلاهما مؤجل التنفيذ، لكنهما يستهلكان المصدر كاملًا. بعد ذلك سنجري عمليات التجميع ونحوّل النتائج إلى بنية فعلية.
الأسئلة الشائعة
هل درس «الترتيب والتجميع باستخدام OrderBy» مجاني؟
نعم — نص درس «الترتيب والتجميع باستخدام OrderBy» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الترتيب والتجميع باستخدام OrderBy»؟
رتّب النتائج وجمّعها تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الترتيب والتجميع باستخدام OrderBy»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصفية باستخدام Where
- التحديد والإسقاط
- الترتيب والتجميع باستخدام OrderBy
- التجميعات وToList