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