انواع Enumerator و Enumerable

در درس‌های قبلی دیدید که چگونه با استفاده از حلقه foreach عناصر یک آرایه را پیمایش می‌کردیم. در این درس می‌خواهیم کمی دقیقتر به قضیه آرایه‌ها نگاه کنیم و ببینیم که چرا از آن‌ها می‌توانند توسط این حلقه مورد پردازش قرار گیرند. همچنین یاد می‌گیرید که چطور از این قابلیت در کلاس‌هایی که خودتان تعریف کرده‌اید استفاده کنید.

استفاده از حلقه foreach

وقتی که از حلقه foreach در یک آرایه استفاده می‌کنید، این حلقه تک تک اعضای آرایه را به شما ارائه داده و اجازه می‌دهد که مقادیر آنها را مشاهده کنید. به عنوان مثال در زیر یک آرایه با چهار عنصر تعریف شده است و می‌خواهیم با استفاده از حلقه foreach مقادیر عناصر آن را چاپ کنیم :

int[] number = { 10, 11, 12, 13 }; 
foreach (int item in number) 
Console.WriteLine("Item value: {0}", item);
Item value: 10
Item value: 11
Item value: 12
Item value: 13

اما چرا از این حلقه برای آرایه‌ها استفاده می‌کنیم؟ چون آرایه به محض درخواست، یک شیء به نام enumerator (شمارنده) تولید می‌کنند. این شیء می‌تواند عناصر آرایه را یک به یک و به ترتیب برگرداند. Enumerator ترتیب عناصر آرایه را می‌داند و بعد از برگرداندن اولین عنصر موقعیت خود را حفظ کرده و در درخواست بعدی عنصر بعدی آرایه را بر می‌گرداند. برای انواعی که دارای شئ شمارنده (enumerator) هستند یک راه برای به دست آوردن این شئ وجود دارد و آن استفاده از متد ()GetEnumerator است. به انواعی که این متد را پیاده سازی می‌کنند نوع شمارش پذیر یا enumerable می گویند. آرایه یک نوع شمارش پذیر است.

از حلقه foreach برای کار با انواع شمارش پذیر (enumerable) استفاده می‌شود. وقتی که یک نوع شمارش پذیر به این حلقه می‌دهیم تا عناصر آن را شمارش کند، مراحل زیر طی می‌شود :

  • ابتدا شئ enumerator را با فراخوانی متد ()GetEnumerator به دست می‌آورد.
  • هر آیتم را از enumerator درخواست کرده و آن را برای شما قابل دسترس می‌کند (نه قابل تغییر).