C# - IEnumerable vs ICollection vs IQueryable

 في .NET، هناك عدة واجهات ومجموعات تُستخدم للتعامل مع البيانات، ولكل منها خصائص واستخدامات مختلفة. الفرق بين IEnumerable، IQueryable، ICollection، و List<T> يتمثل في طريقة التعامل مع البيانات، الأداء، والقدرة على التعديل. إليك الفرق بينها:

1. IEnumerable

  • التعريف: تمثل IEnumerable<T> تسلسلاً يمكن التنقل فيه، ولكنها لا تدعم عمليات التصفية أو التحميل الكسول (lazy loading).
  • الاستخدام: تُستخدم بشكل أساسي عند التعامل مع المجموعات داخل الذاكرة (مثل المصفوفات والقوائم).
  • الأداء: عند استخدام IEnumerable<T> مع قاعدة بيانات، يتم تحميل جميع البيانات إلى الذاكرة قبل تطبيق أي عمليات مثل Where() أو Select().
  • المزايا:
    • مناسبة للتعامل مع المجموعات في الذاكرة.
    • سهلة الاستخدام عند التكرار (foreach).
  • العيوب:
    • لا تدعم الاستعلامات المؤجلة (deferred execution) مثل IQueryable.
    • لا تحتوي على وظائف لتعديل المجموعة.

مثال على الاستخدام:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0); // يتم تصفيتها في الذاكرة

2. IQueryable

  • التعريف: IQueryable<T> امتداد لـ IEnumerable<T> لكنه يسمح بإنشاء استعلامات مباشرة إلى مصدر البيانات مثل Entity Framework و LINQ to SQL.
  • الاستخدام: تُستخدم عندما يكون المصدر قاعدة بيانات وتحتاج إلى تنفيذ استعلامات SQL مباشرة.
  • الأداء: تدعم IQueryable<T> التحميل المؤجل (Lazy Loading) مما يعني أن البيانات لا يتم جلبها من المصدر إلا عند تنفيذ الاستعلام (ToList() أو FirstOrDefault()).
  • المزايا:
    • تدعم deferred execution (يتم تنفيذ الاستعلام فقط عند الحاجة).
    • يتم تحويل الاستعلامات إلى SQL مباشرةً مما يحسن الأداء عند التعامل مع قواعد البيانات.
  • العيوب:
    • لا يمكن استخدامها مع المجموعات في الذاكرة (تعمل فقط مع مصادر بيانات مثل قاعدة بيانات SQL).
    • قد يؤدي تنفيذ بعض العمليات بعد استرجاع البيانات إلى فقدان تحسين الأداء.

مثال على الاستخدام مع Entity Framework:

using (var context = new MyDbContext())
{
    IQueryable<User> users = context.Users.Where(u => u.Age > 18); // يتم تنفيذ الاستعلام في قاعدة البيانات عند استدعاء ToList()
    var userList = users.ToList();
}

3. ICollection

  • التعريف: ICollection<T> هي واجهة تدعم التعديل على العناصر (الإضافة، الحذف) بالإضافة إلى التكرار على العناصر.
  • الاستخدام: تُستخدم عندما نحتاج إلى التعامل مع المجموعات مع إمكانية الإضافة أو الحذف.
  • الأداء: يتم تحميل جميع البيانات إلى الذاكرة، لذا لا يُنصح باستخدامها مع قواعد البيانات مباشرة.
  • المزايا:
    • توفر إمكانية إضافة أو حذف أو تعديل العناصر.
    • تحتوي على خاصية Count لمعرفة عدد العناصر بدون الحاجة للتكرار عليها.
  • العيوب:
    • لا تدعم الاستعلامات مثل IQueryable<T>.
    • لا تدعم deferred execution.

مثال على الاستخدام:

ICollection<int> numbers = new List<int> { 1, 2, 3 };
numbers.Add(4); // يمكننا الإضافة
numbers.Remove(2); // يمكننا الحذف
Console.WriteLine(numbers.Count); // الإخراج: 3

4. List

  • التعريف: List<T> هي تنفيذ (Implementation) ملموس لـ ICollection<T> و IEnumerable<T> وتوفر مزايا مثل الوصول العشوائي إلى العناصر (indexing).
  • الاستخدام: تُستخدم عندما نحتاج إلى قائمة ديناميكية يمكن تعديلها بسهولة.
  • الأداء: يتم تحميل جميع البيانات إلى الذاكرة، لذا لا يُنصح باستخدامها مع قواعد البيانات مباشرة إذا كانت البيانات ضخمة.
  • المزايا:
    • تدعم الإضافة، الحذف، والتعديل بسهولة.
    • تدعم indexing أي الوصول إلى عنصر محدد عبر الفهرس list[0].
    • توفر العديد من الوظائف المفيدة مثل Sort() و Find().
  • العيوب:
    • لا تدعم deferred execution.
    • عند التعامل مع قواعد البيانات، تحتاج إلى تحميل جميع البيانات إلى الذاكرة.

مثال على الاستخدام:

List<int> numbers = new List<int> { 1, 2, 3 };
numbers.Add(4);
numbers.Remove(2);
Console.WriteLine(numbers[0]); // الإخراج: 1

الفرق الأساسي بين هذه الواجهات

متى تستخدم كل منها؟

  • استخدم IEnumerable<T> عندما تحتاج إلى التكرار على البيانات بدون تعديل.
  • استخدم IQueryable<T> عندما تحتاج إلى تنفيذ استعلامات LINQ مباشرة على قاعدة بيانات.
  • استخدم ICollection<T> عندما تحتاج إلى تعديل البيانات ولكن لا تحتاج إلى الوصول العشوائي (indexing).
  • استخدم List<T> عندما تحتاج إلى قائمة ديناميكية تدعم الإضافة، الحذف، والوصول العشوائي.

بهذا، يمكنك اختيار الأنسب بناءً على احتياجاتك في المشروع!

تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

HTML - ملخص شامل لأهم التاجات

HTML - Youtube videos تضمين فيديوهات اليوتيوب