View Full Version : فرق IENumerable با لیست جنریک و آرایه
HOSSEINONLINE7
یک شنبه 03 فروردین 1393, 16:35 عصر
سلام من در مورد IEnumerable ها مطالب زیادی سرچ کردم و خوندم ولی هنوز یکمی برام نامفهموم هست .
من میدونم که لیست های جنریک نوع خاصی ندارن و براساس مقادیری که بهشون داده میشه نوع میگیرن و آرایه ها فقط از یک نوع میتونن مقدار بگیرن.
توی مطالبی که خوندم گفته شده بود IEnumerable ها یک اینترفیس هستن و نوعی از لیست جنریک که مقادیرشون را قابل شمارش میکنن و از کلاسها پیروی میکنن .
این که IEnumerable اینترفیس هست و از کلاسها پیروی میکنن یعنی چی ؟
لطفا برای موارد استفاده که کجا محبور به استفاده ازشون میشیم یک مثال بزنید تا متوجه بشم .
تشکر
tooraj_azizi_1035
یک شنبه 03 فروردین 1393, 17: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, 22: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, 10:49 صبح
دوستان لطفا راهنمایی کنید و یک مثال ساده از مورد استفاده ی واقعی اون بزنید که برای چه کارهایی میشه استفاده کرد.
HOSSEINONLINE7
سه شنبه 05 فروردین 1393, 10:24 صبح
کسی نبود ؟
noroozifar
سه شنبه 05 فروردین 1393, 11:13 صبح
من هم تو قسمت جنریک ها مشکل دارم خیلی زیاد اصلا اینها را متوجه نمیشم مخصوص ICollection ,IENumerable , غیره .... یک پی دی اف یا فایل ویدئویی خوبی در این زمینه وجود ندارد ؟
hadi0x7c7
سه شنبه 05 فروردین 1393, 17: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
(البته من اینا رو از روی اطلاعات جاواییم میگم:خجالت:)
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.