کاربرد IEnumerator و IEnumrable در سی شارپ

سوال

سلام دوستان اگر ممکنه کسی منو راهنمایی کنه که مفهموم کاربرد IEnumerator و IEnumrable در سی شارپ دقیقا چی هست؟ این دوتا چه فرقی دارند و آیا بهم مرتبط هستند یا خیر.!

ممنون از انجمن درسمن

حل شده 0
Sahand 5 سال 2 پاسخ ها 2258 دیده شده 0

پاسخ ها ( ۲ )

  1. سلام دوست عزیزم.

    ببینید در سی شارپ اگر باکالکشن ها آشنایی داشته باشید فهم این موضوع براتون راحت میشه.

    میشه به بیانی اینطور گفت که زیرساخت کالکشن های IEnumrable ها هستند.

    مثلا ما برای پیمایش بین عناصر که اونارو با foreach انجام می دهیم در اصل داریم از خاصیت IEnumrable ها استفاده میکنیم.

    خوب دقت کنید لیست ها یا در اصل کالکشن ها با IEnumrableها ساخته می شوند.

    اصلا بذارید باهم دیگه اینطور جلو بریم:

    کلاس List رو که همه مون باهاش آشناییم در اصل کالکشنه

    حالا بیایم اینو از  ذهنمون پاک کنیم و یک کلاس ساده در نظرش بگیریم مثلا Student

    یعنی کلاس List رو کلا فراموش کنید که یک کالکشنه و مثلا یک کلاس ساده در نظرش بگیرید.(تاکیید میکنم که کلا کالکشن بودنش رو فراموش کنید)

    حالا بازم میتونید روی Listهاتون foreach بزنید؟

    در جواب باید گفت خیر

    حالا شاید بپرسید چرا “خیر”

    حق با شماست سوال درستیه! اما بیایید یکم با ذهن همدیگه بازی کنیم

    آیا شما میتونید یک کلاس Student رو نمونه سازی کنید بعدش ازش توی foreach  استفاده کنید؟!؟ جوابتون خیر هست دیگه!!! چون کلاس Student مگه کالکشنه؟!!!

    دقیقا الان کلاس List ما همین وضعیت رو داره! این Ienumrable ها هستند که ماهیت کالکشنی به کلاس ما میدن.

     

    یواش یواش داریم به جاهای جالبی میرسیم

    شاید باورتون نشه اما شما میتونید کلاس Student  خودتون رو به یک کالکشن تغییر بدید!!! یعنی کالکشن کاستوم خودتون رو بسازید!!!و از این به بعد بجای list ها از کالکشن خودتون استفاده کنید!!!

     

    حالا که فهمیدیم داستان دقیقا چیه بریم سراغ  IEnumrator ها

    ببینید IEnumrator ها بازوی کمکی و قدرتمند برای IEnumrable ها هستند.

    ببینید اینتفریس IEnumrable یه متد داره به نام GetEnumrator

    که یک Ienumrator از جنس جنریک پاس داده شده برمیگردونه!

    هرکلاسی که اینترفیس IEnumrable رو پیاده سازی کنه متد GetEnumrator رو براش پیاده سازی میکنه

    بزارید این مفاهیمی که گفتم رو با کد تشریح میدم که کاملا متوجه بشید.

     

    در سطح IL اگر ما روی List ها حلقه foreach  بزنیم در واقع اون لیست به Ienmrable تبدیل میشه و متد GetEnumrator صدا زده میشه.

    حالا یه مقدار عمیق تر بریم جلو

    اینترفیس IEnumrator در واقع سه عضو داره :

    عضو اول یک پراپرتی هست به نام Current  که آیتم در پوزیشن فعلی رو پیمایش میکنه.

    عضو دوم یه متد هست که اسمش MoveNext هست که پیمایش به آیتم بعدی میکنه

    عضو سوم هم یک متد هست با نام Reset

     

     

    برای اینکه کالکشن ها ایجاد بشن باید این مراحل طی بشه ما همیشه کالکشن هارو خیلی انتزاعی نگاه میکنیم درحالی که شاید دیدی نداشته باشیم که چه فرایندی برای پیمایش توی حلقه داره اتفاق میوفته.

     

    تکه کد زیر یک لیست هست که ما با foreach روی اون پیمایش میکنیم

     

    جالبه بدونید IL اینو تبدیل میکنه به یکIEnumartor و با اون پیمایش میکنه

     

     

     

    حالا شاید دوست داشته باشید کالکشن خودتون رو بسازید مثل مثال زیر عمل کنید و زیر ساخت “شمارشی بودن” رو پیاده سازی کنید.

    مثال زیر یک مثال ساده است و ما یک کالکشن به طول ۱۰۰ عنصری را فضا میدهیم .اما شما میتوانید با آرایه های پویا این مشکل را رفع کنید اما فعلا به دلیل ساده شده مسئله از آرایه با طول ثابت استفاده میکنیم.

     

    آموزش سی شارپ
    شاد و موفق باشید.

    بهترین پاسخ
  2. سلام

    Enumerator شئ است که در یک پیمایش یا به‌عبارت دیگر گذر از روی تک‌تک عضوها ایجاد می‌شود که با حفظ موقعیت فعلی و پیمایش امکان ادامهٔ پیمایش را برای ما فراهم می‌آورد. اگر بخواهید آن را در حقیقت بازسازی کنید شئ Enumerator به‌مانند کاغذ یا جسمی است که بین صفحات یک کتاب قرار می‌دهید که مکانی که در آن قرار دارید را گم نکنید؛ در این مثال، Enumerable همان کتاب است که قابلیت این را دارد که برای پیمایش به وسیلهٔ قرار دادن یک جسم در وسط آن را دارد.

ارسال یک پاسخ