LINQ是否可以使用IEnumerable?
我有一个类实现IEnumerable
,但不实现IEnumerable<T>
。 我不能改变这个类,我不能用另一个类来代替它。 正如我从MSDN了解, 如果类实现IEnumerable<T>
则可以使用LINQ 。 我试过使用instance.ToQueryable()
,但它仍然不启用LINQ方法。 我知道这个类可以包含只有一个types的实例,所以这个类可以实现IEnumerable<T>
,但是它没有。 那么我能做些什么来使用LINQexpression式来查询这个类?
您可以使用Cast<T>()
或OfType<T>
来获取完全支持LINQ的IEnumerable的通用版本。
例如。
IEnumerable objects = ...; IEnumerable<string> strings = objects.Cast<string>();
或者如果你不知道它包含什么types,你总是可以这样做:
IEnumerable<object> e = objects.Cast<object>();
如果您的非genericsIEnumerable
包含各种types的对象,而您只对例如。 你可以做的string:
IEnumerable<string> strings = objects.OfType<string>();
是的,它可以。 您只需使用Cast
函数将其转换为一个types化的IEnumerable<T>
。 例如
IEnumerable e = ...; IEnumreable<object> e2 = e.Cast<object>();
现在e2
是一个IEnumerable<T>
,可以和所有的LINQ函数一起工作。
您还可以使用LINQ的查询理解语法,如果指定了一个types,该语法将转换为范围variables的types(在本例中为item
):
IEnumerable list = new ArrayList { "dog", "cat" }; IEnumerable<string> result = from string item in list select item; foreach (string s in result) { // InvalidCastException at runtime if element is not a string Console.WriteLine(s); }
效果和@ JaredPar的解决scheme是一样的。 有关详细信息,请参阅C#语言规范中的7.16.2.2:显式范围variablestypes 。
是的,它确实,
我会给你简单的例子来更好地理解你
List<Student> obj = new List<Student>(); obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); IEnumerable<Student> students = from x in obj.AsEnumerable() select x; foreach (var item in students) { MessageBox.Show(item.name); } class Student { public string name { get; set; } public int roll { get; set; } public string school { get; set; } }