My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

۱ مطلب با کلمه‌ی کلیدی «enumerator» ثبت شده است

شنبه, ۳ تیر ۱۳۹۶، ۰۴:۲۰ ب.ظ

تفاوت بین Interface های Enumerator و Enumerable در C#

 

انواع  Enumerators  و  Enumerable :

تعریف :

"  Enumerator  شی ای است که قابلیت بازگرداندن  هر مورد از یک لیست و گروه داده ای را  به صورت یک به یک و ترتیبی که از آن درخواست میشود را دارد.  Enumerator به طبقه بندی موارد آگاه است و پیگیری می کند که کجای رشته قرار دارد.

و بعد از آن مقدار مورد جاری را بنا به در خواست باز می گرداند.

Enumerable یک نوع است که یک متد به نام GetEnumerator  دارد که این متد یک enumerator برمی گرداند برای بازگردانی مورد ها.

برای درک بهتر  Enumerators   و  Enumerable نگاهی به یک  مثال می اندازیم :

در مثال زیر ما یک آرایه شامل 5 المان تعریف می کنیم و بعد از ان از یک حلقه foreach برای نمایش مقادیر هر مورد.

class Program

   {

       static void Main()

       {

           int[] arr1 = { 1, 2, 3, 4, 5 }; // Define the array.

 

           foreach (int item in arr1) // Enumerate the elements.

               Console.WriteLine("Item value: {0}", item);

       }

   }

خروجی :

Item value: 1

Item value: 2

Item value: 3

Item value: 4

Item value: 5

 

                                            Enumerables

در مثال بالا :

·         شیء enumerator   را  به وسیله  تابع  GetEnumerator   صدا میزنیم .

·         هر مورد را از enumerator  در خواست می کند و به عنوان متغیر تکراری در کد قابل دسترس قرار می دهد.

 IEnumerator Interface :

 

اینترفیس  IEnumerable  توسط یک کلاس IEnumerable  پیاده سازی می شود.

اینترفیس IEnumerable   فقط یک متد دارد : GetEnumerator  که یک enumerator را برمی گرداند.

                                                     IEnumerator

- Current مقدار جایگاه جاری در رشته را برمی گرداند.

  - خصوصیت read-only است.

  - یک مقدار reference  از نوع داده ای را برمی گرداند پس شی می تواند هر جنسی داشته باشد.

  -MoveNext  متدی است که enumerator را به موقعیت بعدی مکانی پیش می برد. و یک مقدار بولین برمی گرداند که نشان دهنده معتبر بودن موقعیت بعدی و یا انتهای رشته می باشد.

  - اگر موقعیت بعدی معتبر باشد مقدار true است.

  - اگر موقعیت بعدی معتبر نباشد (فرا تر از انتهای رشته باشد) مقدار false است.

  - موقعیت ابتدایی enumerator  ، قبل از اولین مورد در رشته است. پس تابع MoveNext  باید قبل از اولین دسترسی به Current فراخوانی شود.

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

مثال :


class Program

    {

        static void Main()

        {

            List<int> list = new List<int>();

            list.Add(1);

            list.Add(2);

            list.Add(3);

            list.Add(4);

            list.Add(5);

 

            List<int>.Enumerator e = list.GetEnumerator();

            Write(e);

        }

 

        static void Write(IEnumerator<int> e)

        {

            while (e.MoveNext())

            {

                int value = e.Current;

                Console.WriteLine(value);

            }

        }

    } 

 


   }  خروجی:

 

1
2
3
4
5



IEnumerable Interface :

یک کلاس enumerable ، یک  اینترفیس IEnumerable  را پیاده سازی می کند.

اینترفیس IEnumerable  تنها یک متد دارد: GetEnumerator که یک enumerator برمی گرداند.



    IEnumerable




using System.Collections;

 

//Implement the IEnumerable interface

class MyClass : IEnumerable

{

public IEnumerator GetEnumerator { ... }

...


} //Returns an object of type IEnumerator

 

 

 

 

 

using System.Collections;

class MyColors: IEnumerable

{

string[] Colors = { "Red", "Yellow", "Blue" };

public IEnumerator GetEnumerator()

{

return new ColorEnumerator(Colors);//An instance of the enumerator class

}


}


ادامه در پست بعدی .....

۰ نظر موافقین ۰ مخالفین ۰ ۰۳ تیر ۹۶ ، ۱۶:۲۰
سارا زکی زاده