PDA

View Full Version : فرق IENumerable با لیست جنریک و آرایه



HOSSEINONLINE7
یک شنبه 03 فروردین 1393, 15:35 عصر
سلام من در مورد IEnumerable ها مطالب زیادی سرچ کردم و خوندم ولی هنوز یکمی برام نامفهموم هست .

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

توی مطالبی که خوندم گفته شده بود IEnumerable ها یک اینترفیس هستن و نوعی از لیست جنریک که مقادیرشون را قابل شمارش میکنن و از کلاسها پیروی میکنن .

این که IEnumerable اینترفیس هست و از کلاسها پیروی میکنن یعنی چی ؟

لطفا برای موارد استفاده که کجا محبور به استفاده ازشون میشیم یک مثال بزنید تا متوجه بشم .

تشکر

tooraj_azizi_1035
یک شنبه 03 فروردین 1393, 16:51 عصر
سلام
"از کلاسها پیروی میکنن" اشتباهه.
کلاس هایی که اینترفیس ها رو پیاده سازی یا Implement می کنند باید از اون اینترفیس پیروی کنند و پیروی به معنی پیاده سازی متدهایی است که فقط امضا یا Signature اونها در اینترفیس اومده و چگونگی عملکرد اونها در کلاس وارث تعریف میشه.
IEnumerable پسوند able رو داره که نشان از یک قابلیت رو میده و اون قابلیت شمارش پذیری یا مرور تک تک عناصر رو میده.
هر کلاسی که این اینترفیس رو Implement میکنه باید متد GetEnumerator رو پیاده سازی کنه:

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 (IEnumerator) GetEnumerator();
}

public PeopleEnum GetEnumerator()
{
return new PeopleEnum(_people);
}
}



و مقداری از نوع IEnumerator رو برگردونه:


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;
}

object IEnumerator.Current
{
get
{
return Current;
}
}

public Person Current
{
get
{
try
{
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}



و شاید خود Anders بتونه تو رو از جهنمی که سوالاتت برات درست کرده نجاتت بده...

HOSSEINONLINE7
یک شنبه 03 فروردین 1393, 21:24 عصر
سلام
"از کلاسها پیروی میکنن" اشتباهه.
کلاس هایی که اینترفیس ها رو پیاده سازی یا Implement می کنند باید از اون اینترفیس پیروی کنند و پیروی به معنی پیاده سازی متدهایی است که فقط امضا یا Signature اونها در اینترفیس اومده و چگونگی عملکرد اونها در کلاس وارث تعریف میشه.
IEnumerable پسوند able رو داره که نشان از یک قابلیت رو میده و اون قابلیت شمارش پذیری یا مرور تک تک عناصر رو میده.
هر کلاسی که این اینترفیس رو Implement میکنه باید متد GetEnumerator رو پیاده سازی کنه:

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 (IEnumerator) GetEnumerator();
}

public PeopleEnum GetEnumerator()
{
return new PeopleEnum(_people);
}
}



و مقداری از نوع IEnumerator رو برگردونه:


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;
}

object IEnumerator.Current
{
get
{
return Current;
}
}

public Person Current
{
get
{
try
{
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}



و شاید خود Anders بتونه تو رو از جهنمی که سوالاتت برات درست کرده نجاتت بده...

ممنون ولی بازم کامل متوجه نشدم کجا باید استفاده کنم .

لطفا یک مثال عملی از مورد استفاده ی اون در یک پروژه ی واقعی بزنید .

مرسی

HOSSEINONLINE7
دوشنبه 04 فروردین 1393, 09:49 صبح
دوستان لطفا راهنمایی کنید و یک مثال ساده از مورد استفاده ی واقعی اون بزنید که برای چه کارهایی میشه استفاده کرد.

HOSSEINONLINE7
سه شنبه 05 فروردین 1393, 09:24 صبح
کسی نبود ؟

noroozifar
سه شنبه 05 فروردین 1393, 10:13 صبح
من هم تو قسمت جنریک ها مشکل دارم خیلی زیاد اصلا اینها را متوجه نمیشم مخصوص ICollection ,IENumerable , غیره .... یک پی دی اف یا فایل ویدئویی خوبی در این زمینه وجود ندارد ؟

hadi0x7c7
سه شنبه 05 فروردین 1393, 16:21 عصر
خب شما فرض کن یه کلاس نوشتی و میخوای از این کلاس توی یه حلقه foreach استفاده کنی، برای این کار باید از اینترفیس IEnumerable رو پیاده سازی کنی و واسه دیگری هم همین طور.
http://msdn.microsoft.com/en-us/library/92t2ye13%28v=vs.110%29.aspx
http://msdn.microsoft.com/en-us/library/system.collections.ienumerable%28v=vs.110%29.aspx
(البته من اینا رو از روی اطلاعات جاواییم میگم:خجالت:)