تفاوت IEnumerable و IEnumerator
یادمه در یکی از مصاحبه هایی که داشتم مصاحبه کننده وارد مبحث Collection ها شد و ازم خواست تفاوت IEnumerable و IEnumerator رو توضیح بدم.
منم چون فقط اسمشونو شنیده بودم گفتم هردو اینترفیس های Collection هستن
و وقتی مصاحبه کننده گفت: خب؟! همین...؟؟!
تازه فهمیدم چقدر زیاد راجب این دو و تفاوت هاشون نمیدونم...
تفاوت IEnumerable و IEnumerator
برای اینکه موضوع برام جا بیفته، یک مثال واقعی کمکم کرد.
ببینیم IEnumerable چیه؟
فرض کن وارد یک کتابخانه میشیم.
اولین چیزی که می بینیم لیست موضوعات کتابهاست: رمان، فلسفه، تاریخی، علمی و…
اما هنوز به هیچ کتابی نزدیک نشدیم، چیزی ورق نزدیم و هیچکدومو انتخاب نکردیم.
درواقع IEnumerable دقیقاً همین کار رو میکنه:
فقط میگه این مجموعه قابل پیمایشه و میشه روش iterat کرد.
نه آیتم میاره، نه جلو و عقب میره، نه حرکت میکنه.
و IEnumerator چیه؟
حالا نوبت کتابداره! IEnumerator همون کتابداریه که:
حرکت میکنه
آیتم فعلی رو میاره
و حتی دوباره میتونه به اول لیست برگرده
و سه قابلیت اصلی و کلیدی داره:
حرکت به آیتم بعدی : ()MoveNext
آیتم فعلی : Current
برگشت به ابتدا : ()void Reset
یعنی تنها «عامل حرکت» در تمامی collection ها ، IEnumerator هست.
و حالا یه اتفاق جالب رخ میده وقتی ما روی یک لیست حلقه میزنیم.
وقتی مینویسیم:
foreach (var item in list)
کامپایلر اینو تبدیل میکنه به:
IEnumerator enumerator=list.GetEnumerator();
while (enumerator.MoveNext())
{
var item = enumerator.Current;
}
یعنی foreach دقیقا این کار رو انجام میده:
از IEnumerable → یک Enumerator جدید میگیره و باهاش پیمایش انجام میده.
خلاصه تفاوت های اصلی:
🔸️IEnumerable :
مشخص میکنه یک مجموعه قابل پیمایشه (مثل فهرست کتابخانه)
🔹️IEnumerator:
یک الگوریتم پیمایشه (مثل کتابداری که حرکت میکنه و کتاب میاره)
این موضوع شاید وقتیکه متوجه ش شدم ساده بهنظر رسید،
اما فهمیدن همین مفاهیم پایه و به ظاهر ساده ست که کیفیت کد و صاحب کد رو مشخص میکنه.
🔗Link