يعني إيه IEnumerable؟
- هو Interface في .NET بيعرف حاجة أساسية: إن الـCollection أو الـObject اللي بيطبّقه ممكن نلفّ على عناصره (
Iteration
) باستخدام Foreach. - الـInterface ده فيه Method أساسيّة اسمها
GetEnumerator()
، ودي مسؤولة عن ترجيع كائن الـEnumerator اللي يخلينا نعدي على عناصر الـCollection واحد ورا التاني.
ليه مهم؟
- أي Collection في C# (زي List أو Array أو Dictionary… إلخ) بتسمح لنا نستخدم
foreach
عليها عشان بتـImplement الـIEnumerable
أو الـIEnumerable<T
>. - الـ LINQ Methods بتشتغل عمومًا مع
IEnumerable<T>
. بالتالي، نتيجة الاستعلامات دايمًا تقدر تعمل عليهاforeach
أو تدخلها في سلسلة عمليات (الـPipeline) بتاعة الـLINQ.
الفرق بين IEnumerable و IEnumerable<T>
- الـ
IEnumerable
(اللي من غير Generics) بيرجعobject
في الـEnumerator. غالبًا مش هنستخدمه بشكل مباشر في الكود اليومي. - الـ
IEnumerable<T>
(اللي فيه Cs Generics) بيرجع العنصر بالـType بتاعه، وده اللي بنتعامل معاه في الـLINQ والـCollections الحديثة.
إزاي نطبقه؟
- لو عندك
Class
خاص وعايزه يمشي فيforeach
، ممكن تنفذ الـIEnumerable<T>
وتكتبGetEnumerator()
بنفسك أو تستخدمyield return
. - بشكل ده عناصر الكلاس بترجع واحدة واحدة.
قولنا الخطوات بالتفصيل في الـ Cs Enumerable
مثال بسيط
public class MyNumbers : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
for (int i = 1; i <= 5; i++)
{
yield return i;
}
}
// Must Implement GetEnumerator for IEnumerable
// لازم نImplement GetEnumerator للـ IEnumerable (من غير Generics)
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
// وبعدين نستخدمه بالشكل ده:
var nums = new MyNumbers();
foreach (var num in nums)
{
Console.WriteLine(num);
}
في المثال ده، GetEnumerator()
بترجع الأرقام من واحد لـ 5 باستخدام yield return
.
ليه ممكن يفيدك؟
- بيخلي الكود أبسط في الـ
foreach
loops. - مهم جدًا في استخدام LINQ ومعظم الـCollections.
- مفيد جدًا لما تحب تولّد بيانات بالتدريج (
On-the-fly
) من غير ما تفضّل محتفظ بكل البيانات في الذاكرة مرة واحدة.
الخلاصة
- الـ(IEnumerable) هو العمود الفقري اللي بيخليك تقدر تستخدم
foreach
و LINQ في الـ.NET. لو احتجت تعمل حاجة تقدر تلف عليها خطوة بخطوة، بتImplement الـIEnumerable أو الـIEnumerable<T>
وترجع عناصرك واحدة واحدة.