بستخدمهم لما بجيب داتا من الداتا بيز من غير أي Filtration
الفرق بين IEnumerable و IReadOnlyList يكمن في الغرض الأساسي لكل واجهة، طريقة الوصول إلى البيانات، والدوال التي تقدمها. فيما يلي مقارنة تفصيلية بينهما:
- لو عايز أعمل Iteration من الأول للآخر يبقا هستخدم
IEnumerable - انما لو مش محتاج أعمل كدا هستخدم
IReadOnlyList
.net - IEnumerable<T> vs IReadOnlyList<T> - Stack Overflow
IEnumerable<T> represents a forward-only cursor over some data. You can go from start to end of the collection, looking at one item at a time.
IReadOnlyList<T> represents a readable random access collection.
IEnumerable<T> is more general, in that it can represent items generated on the fly, data coming in over a network, rows from a database, etc.
IReadOnlyList<T> on the other hand basically represents only in-memory collections (Cashing).
If you only need to look at each item once, in order, then IEnumerable<T> is the superior choice - it’s more general.
1. IEnumerable
الوظيفة:
- الـ
IEnumerableتُستخدم للتعامل مع التكرار (Iteration) فقط، مما يعني أنها تسمح لك بالتنقل بين عناصر المجموعة (Collection) باستخدامforeach.
الخصائص:
- قراءة فقط (Read-Only):
- لا يمكن تعديل المجموعة (لا يوجد دوال مثل
AddأوRemove).
- لا يمكن تعديل المجموعة (لا يوجد دوال مثل
- التنقل:
- يتم التنقل بين العناصر واحدًا تلو الآخر.
- الأداء:
- مناسب للعمليات التي تحتاج إلى التكرار فقط.
القيود:
- لا تتيح الوصول المباشر إلى عنصر معين باستخدام الفهرس (Index).
- لا توفر معلومات عن طول المجموعة (
Countغير متاح).
متى تستخدم؟
- عندما تحتاج إلى التنقل بين العناصر فقط (بدون تعديل أو وصول مباشر باستخدام الفهرس).
مثال:
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4 };
foreach (var number in numbers)
{
Console.WriteLine(number); // يطبع كل الأرقام
}2. IReadOnlyList
الوظيفة:
- الـ
IReadOnlyListتُستخدم للوصول إلى العناصر كمجموعة قراءة فقط (Read-Only)، مع إمكانية الوصول المباشر باستخدام الفهرس (Index).
الخصائص:
- قراءة فقط (Read-Only):
- مثل
IEnumerable، لا يمكن تعديل البيانات.
- مثل
- الوصول المباشر:
- تدعم الوصول إلى العناصر عن طريق الفهرس (مثل
list[0]).
- تدعم الوصول إلى العناصر عن طريق الفهرس (مثل
- توفر معلومات الطول:
- تحتوي على خاصية
Countلمعرفة عدد العناصر.
- تحتوي على خاصية
القيود:
- تُستخدم للقراءة فقط، ولا يمكن تعديل المجموعة.
متى تستخدم؟
- عندما تحتاج إلى التنقل بين العناصر والوصول المباشر لعناصر معينة باستخدام الفهرس.
مثال:
IReadOnlyList<int> numbers = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(numbers[2]); // يطبع 3
Console.WriteLine(numbers.Count); // يطبع 4مقارنة بين IEnumerable و IReadOnlyList
| الميزة | IEnumerable | IReadOnlyList |
|---|---|---|
| قراءة فقط (Read-Only) | نعم | نعم |
| الوصول بالعناصر (Index) | غير مدعوم | مدعوم |
| معرفة عدد العناصر | غير متاح | متاح باستخدام Count |
| الغرض | التنقل (Iteration) فقط | التنقل والوصول المباشر |
| التنفيذ | واجهة بسيطة للتكرار | واجهة أقوى للوصول والتكرار |
ملاحظات مهمة:
- الـ
IEnumerableهو الخيار الأبسط والأخف، ومناسب للسيناريوهات التي لا تحتاج إلى وصول مباشر أو معرفة طول المجموعة. - الـ
IReadOnlyListيوفر مميزات إضافية مثلIndexوCount، لذلك يُفضل عند التعامل مع البيانات التي تحتاج وصول مباشر لكن بدون تعديل. - كلاهما Read-Only:
- لا يمكن تعديل البيانات من خلال أي منهما.
استخدام عملي:
IEnumerable:
- مناسب عندما تكون مهتم فقط بالتكرار، مثل قراءة السجلات من قاعدة بيانات:
IEnumerable<string> names = dbContext.Employees.Select(e => e.Name);
foreach (var name in names)
{
Console.WriteLine(name);
}IReadOnlyList:
- مناسب عندما تحتاج للوصول إلى عناصر معينة أو معرفة الطول:
IReadOnlyList<string> names = new List<string> { "Ali", "Sara", "Mona" };
Console.WriteLine(names[1]); // Sara
Console.WriteLine(names.Count); // 3