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>عندما تحتاج إلى قائمة ديناميكية تدعم الإضافة، الحذف، والوصول العشوائي.
بهذا، يمكنك اختيار الأنسب بناءً على احتياجاتك في المشروع!
تعليقات
إرسال تعليق