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

الخصائص:

  1. قراءة فقط (Read-Only):
    • لا يمكن تعديل المجموعة (لا يوجد دوال مثل Add أو Remove).
  2. التنقل:
    • يتم التنقل بين العناصر واحدًا تلو الآخر.
  3. الأداء:
    • مناسب للعمليات التي تحتاج إلى التكرار فقط.

القيود:

  • لا تتيح الوصول المباشر إلى عنصر معين باستخدام الفهرس (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).

الخصائص:

  1. قراءة فقط (Read-Only):
    • مثل IEnumerable، لا يمكن تعديل البيانات.
  2. الوصول المباشر:
    • تدعم الوصول إلى العناصر عن طريق الفهرس (مثل list[0]).
  3. توفر معلومات الطول:
    • تحتوي على خاصية Count لمعرفة عدد العناصر.

القيود:

  • تُستخدم للقراءة فقط، ولا يمكن تعديل المجموعة.

متى تستخدم؟

  • عندما تحتاج إلى التنقل بين العناصر والوصول المباشر لعناصر معينة باستخدام الفهرس.

مثال:

IReadOnlyList<int> numbers = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(numbers[2]); // يطبع 3
Console.WriteLine(numbers.Count); // يطبع 4

مقارنة بين IEnumerable و IReadOnlyList

الميزةIEnumerableIReadOnlyList
قراءة فقط (Read-Only)نعمنعم
الوصول بالعناصر (Index)غير مدعوممدعوم
معرفة عدد العناصرغير متاحمتاح باستخدام Count
الغرضالتنقل (Iteration) فقطالتنقل والوصول المباشر
التنفيذواجهة بسيطة للتكرارواجهة أقوى للوصول والتكرار

ملاحظات مهمة:

  1. الـIEnumerable هو الخيار الأبسط والأخف، ومناسب للسيناريوهات التي لا تحتاج إلى وصول مباشر أو معرفة طول المجموعة.
  2. الـIReadOnlyList يوفر مميزات إضافية مثل Index و Count، لذلك يُفضل عند التعامل مع البيانات التي تحتاج وصول مباشر لكن بدون تعديل.
  3. كلاهما 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