افزودن قابلیت Foreach به یک کلاس
معمولا براتی شمارش و حلقه از دستور for استفاده میشه ولی بعضی وقتها ( جایی که داده ما قابل شمارش باشه ) و فقط مایل به گرفتن اطلاعات باشیم بجای for میشه از foreach استفاده کرد . با استفاده از این دستور میشه در بین یک سری object که از یک کلاس بوجود اومدن یکسری اطلاعات دریافت کرد .
مثلا فرض کنید یک کلاس people دارید که از یک سری person تشکیل شده ( یعنی person هم یک کلاس است ) برای اینکه مثلا نام اشخاص را در خروجی چاپ کنید و یا کارهای مشابه می توانید بجای for از foreach استفاده کنید . بدین منظور people باید اینترفیس Inumerable را به شکل زیر پیاده سازی کند .
using System.Collections;
{
public Person(string fName, string lName)
{
this.firstName = fName;
this.lastName = lName;
}
public string lastName;
}
{
private Person[] _people;
public People(Person[] pArray)
{
_people = new Person[pArray.Length];
{
_people[i] = pArray[i];
}
}
{
return new PeopleEnum(_people);
}
}
{
public Person[] _people;
// until the first MoveNext() call.
int position = -1;
{
_people = list;
}
{
position++;
return (position < _people.Length);
}
{
position = -1;
}
{
get
{
try
{
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}
{
static void Main()
{
Person[] peopleArray = new Person[3]
{
new Person(“John”, “Smith”),
new Person(“Jim”, “Johnson”),
new Person(“Sue”, “Rabon”),
};
foreach (Person p in peopleList)
Console.WriteLine(p.firstName + ” ” + p.lastName);
}
*
* John Smith
* Jim Johnson
* Sue Rabon
*
*/
در مثال بالا کلاس Person دو صفت با نام ( نام و نام خانوادگی دارد ) و در کلاس اصلی که کلاس App است . سه شخص با نام های مختلف ایجاد کردیم و بعد در کلاس People لیستی از اشخاص را گرفتیم تا نشان دهیم که منظور ما از people دسته ای از افراد هستند و در نهایت برای اینکه در کلاس App بتوانیم نام و نام خانوادگی اشخاص متفاوت را چاپ کنیم اینترفیس Ienumerable را در کلاس people پیاده سازی کردیم تا این کلاس قابل شمارش شود . در نهایت در کلاس App بر روی people یک foreach زده شد و خروجی مورد نیاز دریافت شد .
نکته مهم آن است که با استفاده از دستور Foreach نمی توان تحت هیچ شرایطی مسخصات کلاس people را عوض کرد مثلا نمی توانیم بگوییم :
foreach (Person p in peopleList)
p.firstName = ”Nasser”;
منبع: سایت مایکروسافت

