يُعد فرز قوائم الكائنات بكفاءة حسب خاصية محددة مهارةً أساسية لأي مطور C#. تتناول هذه المقالة نهجين رئيسيين: الاستفادة من طريقة OrderBy
في LINQ واستخدام طريقة List<T>.Sort
مع مندوبين. سنفحص نقاط القوة والضعف لكل منهما، مما يساعدك على اختيار الطريقة الأنسب لاحتياجاتك المحددة.
محتويات الجدول
استخدام طريقة OrderBy
في LINQ
توفر طريقة OrderBy
في LINQ طريقةً نظيفةً وسهلة القراءة لفرز القوائم. وهي تستخدم تعبيرات لامدا لتحديد معايير الفرز، وتعيد قائمةً *جديدة* مُرتبة، تاركة القائمة الأصلية كما هي. هذا مثالي عندما تحتاج إلى الحفاظ على البيانات الأصلية.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// فرز حسب الاسم (تصاعدي)
var sortedByName = people.OrderBy(p => p.Name).ToList();
Console.WriteLine("Sorted by Name:");
PrintPeople(sortedByName);
// فرز حسب العمر (تنازلي)
var sortedByAgeDescending = people.OrderByDescending(p => p.Age).ToList();
Console.WriteLine("nSorted by Age (Descending):");
PrintPeople(sortedByAgeDescending);
}
static void PrintPeople(List<Person> people)
{
foreach (var person in people)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
}
}
استخدام المندوبين مع List<T>.Sort
في المواقف التي تتطلب المزيد من التحكم أو إعادة استخدام منطق الفرز، توفر المندوبون بديلاً قويًا. تقوم طريقة List<T>.Sort
بفرز القائمة *مباشرةً*، مع تعديل القائمة الأصلية مباشرةً. قد يكون هذا أكثر كفاءةً للقوائم الكبيرة جدًا، ولكن تذكر أنه يغير البيانات الأصلية.
using System;
using System.Collections.Generic;
// ... فئة Person من الأعلى ...
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// فرز حسب الاسم (تصاعدي) باستخدام مندوب
people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
Console.WriteLine("Sorted by Name (In-place):");
PrintPeople(people);
// فرز حسب العمر (تنازلي) باستخدام مندوب
people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age)); // لاحظ الترتيب المعكوس للتنازلي
Console.WriteLine("nSorted by Age (Descending, In-place):");
PrintPeople(people);
}
// ... طريقة PrintPeople من الأعلى ...
}
اختيار الطريقة المناسبة
يعتمد النهج الأمثل على متطلباتك المحددة:
OrderBy
(LINQ): مثالي لمهام الفرز البسيطة حيث يكون الحفاظ على القائمة الأصلية أمرًا بالغ الأهمية. وهو بشكل عام أكثر قابلية للقراءة.List<T>.Sort
(مع المندوبين): يوفر تحكمًا أكبر ويمكن أن يكون أكثر كفاءةً للقوائم الكبيرة جدًا عندما يكون تعديل القائمة الأصلية مقبولاً. مفيد لمنطق المقارنة المعقد أو وظائف الفرز القابلة لإعادة الاستخدام.
ضع في اعتبارك بعناية ما إذا كنت بحاجة إلى الحفاظ على ترتيب القائمة الأصلية والآثار التي قد تنجم عن الأداء على تطبيقك قبل اتخاذ اختيارك.