PDA

View Full Version : خروجی دستور Linq و IEnumerable



ali_mnkt
جمعه 24 شهریور 1391, 01:57 صبح
با سلام

دوستان می خواسم یک مقدار در مورد IEnumerable برام توضیح بدین . بذارید یکم واضحتر بگم .کد زیر رو در نظر بگیرید :


List<person> list = new List<person>()
{
new person{ name="alireza" , family="mirazei"},
new person{name="mohamad" , family="mohamadi"}
};

IEnumerable<person> harchi = from p in list
where p.name == "alireza"
select p;

خوب خروجی دستور linq نوشته شده مگه به چه فرمتی هست که باید در IEnumerable قرار بگیره ؟

خوب چرا کد زیر غلطه ؟


List<person> list = new List<person>()
{
new person{ name="alireza" , family="mirazei"},
new person{name="mohamad" , family="mohamadi"}
};

List<person> harchi = from p in list
where p.name == "alireza"
select p;

خوب مگه IEnumerable یک لیست generic نیست مگه list یک لیست generic نیست ؟ خوب چرا کد دوم خطا داره ؟


لطفا فقط دوستان ساده توضح بدید .

ali_mnkt
جمعه 24 شهریور 1391, 12:41 عصر
کسی نمی تونه کمک کنه ؟

A.S.Roma
جمعه 24 شهریور 1391, 19:36 عصر
IEnumerable همون جوری که از اسمش مشخصه یک Interface هست.
خروجی دستور LINQ هم به شکل IEnumerable هست. درسته که List از این اینترفیس Inherite شده اما در درخت inheritance نمیشه به شکل top down حرکت کرد. در واقع چنین دستوری معتبر هست :
IEnumerable<DataAccess.Person> list = new List<DataAccess.Person>();
چون به شکل bottom up هست. اما برعکسش معتبر نیست.
به همین جهت Extension Method ی بنام ToList نوشته شده .
//

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);

ali_mnkt
جمعه 24 شهریور 1391, 20:12 عصر
IEnumerable همون جوری که از اسمش مشخصه یک Interface هست.
خروجی دستور LINQ هم به شکل IEnumerable هست. درسته که List از این اینترفیس Inherite شده اما در درخت inheritance نمیشه به شکل top down حرکت کرد. در واقع چنین دستوری معتبر هست :
IEnumerable<DataAccess.Person> list = new List<DataAccess.Person>();
چون به شکل bottom up هست. اما برعکسش معتبر نیست.
به همین جهت Extension Method ی بنام ToList نوشته شده .
//



public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);


مرسی از راهنماییت یک قسمت برای من نامفهوم هست : مگه IEnumerable یک interface نیست ؟ خوب مگه تعریف interface این نیست که کلاسی است که کلاس های دیگه می تونن از اون ارث بری داشته باشن و از الگوی اون استفاده کنن ؟ خوب چطور یک interface به صورت یک dataType در نظر گرفته می شه که خروجی دستورات linq داخلش قرار می گیره ؟

meisam12
جمعه 24 شهریور 1391, 20:21 عصر
شما قسمت آخر را باید به صورت زیر تغییر دهید :

List<person> harchi = (from p in list
where p.name == "alireza"
select p).ToList();



با سلام

دوستان می خواسم یک مقدار در مورد IEnumerable برام توضیح بدین . بذارید یکم واضحتر بگم .کد زیر رو در نظر بگیرید :


List<person> list = new List<person>()
{
new person{ name="alireza" , family="mirazei"},
new person{name="mohamad" , family="mohamadi"}
};

IEnumerable<person> harchi = from p in list
where p.name == "alireza"
select p;

خوب خروجی دستور linq نوشته شده مگه به چه فرمتی هست که باید در IEnumerable قرار بگیره ؟

خوب چرا کد زیر غلطه ؟


List<person> list = new List<person>()
{
new person{ name="alireza" , family="mirazei"},
new person{name="mohamad" , family="mohamadi"}
};

List<person> harchi = from p in list
where p.name == "alireza"
select p;

خوب مگه IEnumerable یک لیست generic نیست مگه list یک لیست generic نیست ؟ خوب چرا کد دوم خطا داره ؟


لطفا فقط دوستان ساده توضح بدید .

A.S.Roma
جمعه 24 شهریور 1391, 22:05 عصر
مرسی از راهنماییت یک قسمت برای من نامفهوم هست : مگه IEnumerable یک interface نیست ؟ خوب مگه تعریف interface این نیست که کلاسی است که کلاس های دیگه می تونن از اون ارث بری داشته باشن و از الگوی اون استفاده کنن ؟ خوب چطور یک interface به صورت یک dataType در نظر گرفته می شه که خروجی دستورات linq داخلش قرار می گیره ؟
در این مورد شاید این مثال کمکتون کنه :

public interface IBase
{
void DoWork();
}

public class A : IBase
{
public void DoWork()
{
throw new NotImplementedException();
}
}

public class B : IBase
{
public void DoWork()
{
throw new NotImplementedException();
}
}

public class Main
{
public IBase Test(int type)
{
if (type == 1)
return new A();
return new B();
}
}

در واقع برای کسی که متد test رو call کرده تایپ object اعمم از اینکه A باشد یا B مهم نیست. مهم متد DoWork هست که می خواد اونو Call کنه.

ali_mnkt
جمعه 24 شهریور 1391, 23:34 عصر
در این مورد شاید این مثال کمکتون کنه :

public interface IBase
{
void DoWork();
}

public class A : IBase
{
public void DoWork()
{
throw new NotImplementedException();
}
}

public class B : IBase
{
public void DoWork()
{
throw new NotImplementedException();
}
}

public class Main
{
public IBase Test(int type)
{
if (type == 1)
return new A();
return new B();
}
}

در واقع برای کسی که متد test رو call کرده تایپ object اعمم از اینکه A باشد یا B مهم نیست. مهم متد DoWork هست که می خواد اونو Call کنه.

یکم می شه بیشتر توضیح بدی . زیاد متوجه نشدم .