يعني إيه 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.
ليه ممكن يفيدك؟
- بيخلي الكود أبسط في الـ
foreachloops. - مهم جدًا في استخدام LINQ ومعظم الـCollections.
- مفيد جدًا لما تحب تولّد بيانات بالتدريج (
On-the-fly) من غير ما تفضّل محتفظ بكل البيانات في الذاكرة مرة واحدة.
الخلاصة
- الـ(IEnumerable) هو العمود الفقري اللي بيخليك تقدر تستخدم
foreachو LINQ في الـ.NET. لو احتجت تعمل حاجة تقدر تلف عليها خطوة بخطوة، بتImplement الـIEnumerable أو الـIEnumerable<T>وترجع عناصرك واحدة واحدة.