صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

The IEnumerable Interface

در مقاله قبل آموختیم که کلاسی که IEnumberator را اعمال  می کند قادر به پیمایش رکورد به رکورد داده ها توسط یک حلقه While می باشد ، داشتن  خاصیت Current برای مشخص نمودن آیتم جاری ،متد MoveNext برای حرکت به آیتم بعدی و متد Reset برای ریست نمودن پیماینده شاخص های آن می باشند .

در صورتی که یک List  کل اطلاعات را در بر دارد و در صورت زیاد بودن رکورد ها قادر به پیمایش آن نخواهد بود . بنابراین IEnumerator برای پیمایش رکورد ها با حجم زیاد بسیار مناسب خواهد بود چرا که اطلاعات را تک به تک پیمایش کرده و هر بار یک رکورد را در حافظه قرار می دهد .

 

اکنون می خواهم در ادامه مطلب فوق در مورد IEnumerable Inteface صحبت کنم .این اینترفیس متد

GetEnumerator را در اختیار ما قرار می دهد و پارامتر برگشتی این متد از نوع همان اینترفیس IEnumberator  است در واقع کلاس ما را قابل پیمایش می کند تا بتوانیم حلقه foreach  را در مورد کلاسمون بکار ببریم . فرم کلی بصورت زیر است :



اکنون یک مثال را با هم مرور می کنیم فرض کنید کلاس داریم به نام ColorEnumerator این کلاس از اینترفیس IEnumerator  ارث بری می کند این کلاس یک رشته از رنگها را در بر می گیرد ، چون اینترفیس IEnumerator  را بر روی آن مطابق شکل زیر اعمال کردیم پس قابل پیمایش می باشد .



اکنون ما کلاسی دیگر ایجاد می کنیم که از اینترفیس IEnumerable  وراث دارد ، این کلاس در متد GetEnumerator پارمتری از نوع کلاس بالا برمی گرداند مطابق شکل زیر :



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

مطابق شکل زیر :


فرض کنیم کلاسی داشته باشیم که مشخصات پرسنل سازمانی را نشان می دهد ، سپس توسط توایعی لیست فرضا از هزار پرسنل سازمان را تولید کنیم ، ما اکنون می خواهیم بر روی این لیست پرسنل پیمایش کنیم ، راه حل ساده است باید کلاس پرسنل خودتان را بوسیله

Enumerators and Enumerable اعمال کنید .


non-generic interface-IEnumerator & IEnumerable interfaces

 

بخش اول

IEnumerator Interface

حتما با داده های شمارشی سروکار داشته اید مانند آرایه ها ، آرایه ها ممکن است ساده باشند مثلا آرایه عددی یا پیچیده تر مثلا آرایه ای از اشیا حتما سروکار شما با حلقه foreach بوده ، خوب اگر کنجکاوی کرده باشید متوجه شده اید که  foreach بر روی تمامی اشیاء نمی تواند گردش کند.

اینجا می خواهم از اینترفیسهای شمارنده صحبت کنم .ما می خواهیم در مورد فرمی از enumerator صحبت کنیم که بصورت کلاسی است که اینترفیس IEnumerator را پیاده سازی می کند .من می خواهم در این مطلب در مورد IEnumerator and IEnumerable interfaces در دات نت صحبت کنم . Enumerators می تواند راه حل بسیار توانمندی باشد برای داده های شمارش پذیر. شاید برای شما اتفاق افتاده باشد که مجموعه ای از داده ها را داشته باشید که بصورت لیست است اما ابتدا و انتهای لیست مشخص نباشد ، بر خلاف آرایه ها .و یا داده هایی را ازمنبعی بدست می آورید که نا همگام باشد.اینجاست که شمارنده های  IEnumerator به کار شما می آید و شما براحتی می توانید برای دادهای خود ، پیمایشگر یا حرکت دهنده از مقداری به مقدار دیگر تعریف کنید .و یا به تعبیری دیگر شما می خواهید کلاسی داشته باشید با عناصر شمارش پذیر و قابل جابجایی ، اگر شما کلاسی داشته باشید که عناصر آن مجموعه ای از لیست ها یا داده هایی باشندکه از یک منبع داده استخراج شده باشند چگونه می خواهید اطلاعات آن را نمایش دهید و یا اطلاعاتی به آن بیفزاییند ،ویرایش کنید

جواب : به کمک IEnumerator and IEnumerable interfaces

حال سوال این است که IEnumerator interface چه کارهایی را انجام می دهد ؟

این اینترفیس شامل سه متد مهم است Current, MoveNext, and Reset

Current : خصوصیتی هست که موقعیت فعلی لیست را برمی گرداند .خصوصیتی فقط خواندنی است و چیزی که برمی گرداند از نوع object  است .

MoveNext : متدی است که شمارنده را به موقعیت بعدی منتقل می کند و مقدار برگشتی آن یک مقدار منطقی Boolean است .اگر به موقعیت جدید منتقل شد مقدار true  برمی گرداند اما اگر موقعیت جدید نباشد مقدار false  را برمی گرداند

Reset : متدی برای برگرداندن شمارنده به موقعیت اولیه خود قبل از جابجایی است .به تعبیری دیگر موقعیت اولیه لیست را برمی گرداند .


اکنون سعی می کنم با کد مسله را توضیح بدهم .کلاس suitsEnumerator
را در نظر بگیرید که دارای کدهای زیر است .این کلاس دارای آرایه ای از عناصر
 است که ما می خواهیم به این عناصر دسترسی پیدا کنیم .


دقت کنید که فضای نام
using System.Collections باید حتما باشد
 و کلاس ما از اینترفیس
IEnumerator ارث بری می کند . ما ابتدا یک آرایه
تعریف کردیم و مقدار دهی کردیم
سپس متغیر m_nCurr را برای استفاده
 به عنوان اندیکس تعریف می کنیم که مقدار اولیه آن منفی یک است اکنون
به متد reset
دقت کنید که چگونه باز تعریف شده است ، هر وقت این متد
 فراخوانی می شود ، شمارنده ما به مکان اول خود برمی گردد
در کادر
سبز رنگ بالا متد movenext
تعریف شده است . این متد ،متغیر اندیکس
 را در هر بار
فراخوانی به مقدار یک واحداضافه می کند .اما اگر مقدار متغیر
 ما بیشتر از 4 شد پس مقدار  false
را برمی گرداند یعنی شمارنده به انتهای
 لیست
رسیده است و در نهایت کادر مشکی رنگ را مشاهده کنید که
 خصوصیت current راباز تعریف می کند، همانطور که می بینید مقداربرگشتی
 آن از نوع object است در اینجا اگر موقعیت کمتر از صفر یا بزرگتر از 3 باشد ،
یک پیغام خطا نمایش می دهد در غیر اینصورت عنصر متناظر با آن موقعیت
 را برمی گرداند .خوب حالا که نحوه تعریف کلاس مشتق شده از اینترفیس
 IEnumeratorآشنا شدیم در زیر نحوه فراخوانی آن را نمایش
می دهیم
کدهای زیر را مشاهده کنید :




برنامه را اجرا کنید تا
نتیجه را ببینید .خواهید دید که چگونه تنها با فراخوانی متدها می توانید
 به عناصرکلاس دسترسی پیدا کنید .