يعني إيه 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.

ليه ممكن يفيدك؟

  1. بيخلي الكود أبسط في الـforeach loops.
  2. مهم جدًا في استخدام LINQ ومعظم الـCollections.
  3. مفيد جدًا لما تحب تولّد بيانات بالتدريج (On-the-fly) من غير ما تفضّل محتفظ بكل البيانات في الذاكرة مرة واحدة.

الخلاصة

  • الـ(IEnumerable) هو العمود الفقري اللي بيخليك تقدر تستخدم foreach و LINQ في الـ.NET. لو احتجت تعمل حاجة تقدر تلف عليها خطوة بخطوة، بتImplement الـIEnumerable أو الـIEnumerable<T> وترجع عناصرك واحدة واحدة.