افزودن قابلیت Foreach به یک کلاس

frameworknewlogo

frameworknewlogo

معمولا براتی شمارش و حلقه از دستور for استفاده میشه ولی بعضی وقتها ( جایی که داده ما قابل شمارش باشه ) و فقط مایل به گرفتن اطلاعات باشیم بجای for میشه از foreach استفاده کرد . با استفاده از این دستور میشه در بین یک سری object که از یک کلاس بوجود اومدن یکسری اطلاعات دریافت کرد .

مثلا فرض کنید یک کلاس people دارید که از یک سری person تشکیل شده ( یعنی person هم یک کلاس است ) برای اینکه مثلا نام اشخاص را در خروجی چاپ کنید و یا کارهای مشابه می توانید بجای for از foreach استفاده کنید . بدین منظور people باید اینترفیس Inumerable را به شکل زیر پیاده سازی کند .

using System;
using System.Collections;
public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }
    public string firstName;
    public string lastName;
}
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];
        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return new PeopleEnum(_people);
        }
}
public class PeopleEnum : IEnumerator
{
    public Person[] _people;
    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;
    public PeopleEnum(Person[] list)
    {
        _people = list;
    }
    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }
    public void Reset()
    {
        position = -1;
    }
    public object Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}
class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person(“John”, “Smith”),
            new Person(“Jim”, “Johnson”),
            new Person(“Sue”, “Rabon”),
        };
        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + ” ” + p.lastName);
    }
}
/* This code produces output similar to the following:
 *
 * 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”;

منبع: سایت مایکروسافت

3 Responses to افزودن قابلیت Foreach به یک کلاس

  1. امین says:

    خیلی برام جالب بود. ممنون

  2. سروش says:

    اوهوم

  3. codeprojects says:

    الگوی ی جالبی بود…
    تشکر.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: