کاربرد IEnumerator و IEnumrable در سی شارپ
سوال
سلام دوستان اگر ممکنه کسی منو راهنمایی کنه که مفهموم کاربرد IEnumerator و IEnumrable در سی شارپ دقیقا چی هست؟ این دوتا چه فرقی دارند و آیا بهم مرتبط هستند یا خیر.!
ممنون از انجمن درسمن
حل شده
0
انجمن برنامه نویسان سی شارپ
5 سال
2 پاسخ ها
2283 دیده شده
0
پاسخ ها ( ۲ )
سلام دوست عزیزم.
ببینید در سی شارپ اگر باکالکشن ها آشنایی داشته باشید فهم این موضوع براتون راحت میشه.
میشه به بیانی اینطور گفت که زیرساخت کالکشن های 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 و با اون پیمایش میکنه
حالا شاید دوست داشته باشید کالکشن خودتون رو بسازید مثل مثال زیر عمل کنید و زیر ساخت “شمارشی بودن” رو پیاده سازی کنید.
مثال زیر یک مثال ساده است و ما یک کالکشن به طول ۱۰۰ عنصری را فضا میدهیم .اما شما میتوانید با آرایه های پویا این مشکل را رفع کنید اما فعلا به دلیل ساده شده مسئله از آرایه با طول ثابت استفاده میکنیم.
آموزش سی شارپ
شاد و موفق باشید.
سلام
Enumerator شئ است که در یک پیمایش یا بهعبارت دیگر گذر از روی تکتک عضوها ایجاد میشود که با حفظ موقعیت فعلی و پیمایش امکان ادامهٔ پیمایش را برای ما فراهم میآورد. اگر بخواهید آن را در حقیقت بازسازی کنید شئ Enumerator بهمانند کاغذ یا جسمی است که بین صفحات یک کتاب قرار میدهید که مکانی که در آن قرار دارید را گم نکنید؛ در این مثال، Enumerable همان کتاب است که قابلیت این را دارد که برای پیمایش به وسیلهٔ قرار دادن یک جسم در وسط آن را دارد.