بستخدمهم لما بجيب داتا من الداتا بيز من غير أي 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