2011-10-13 33 views
59

我有一個類實現IEnumerable,但不實現IEnumerable<T>。我不能改變這個類,我不能用另一個類來代替它。正如我從MSDN LINQ can be used if class implements IEnumerable<T>瞭解的。我試過使用instance.ToQueryable(),但它仍然不啓用LINQ方法。我確定這個類可以包含只有一種類型的實例,所以這個類可以實現IEnumerable<T>,但它不是。那麼,我可以做什麼來使用LINQ表達式來查詢這個類?LINQ是否可以使用IEnumerable?

+0

沒有鑄造了IEnumerable,而不是所有的LINQ方法,你只看到8種方法:AsQueryable已,Cast <>,Equals,GetEnumerator,GetHashCode,GetType,OfType <>,ToString – ShawnFeatherly

回答

101

您可以使用Cast<T>()OfType<T>來獲得完全支持LINQ的IEnumerable的通用版本。

例如,

IEnumerable objects = ...; 
IEnumerable<string> strings = objects.Cast<string>(); 

或者,如果你不知道它包含什麼類型的,你總是可以做:

IEnumerable<object> e = objects.Cast<object>(); 

如果您非一般的IEnumerable含有多種類型的對象,你只能在如感興趣。琴絃,你可以這樣做:

IEnumerable<string> strings = objects.OfType<string>(); 
9

是的,它可以。您只需使用Cast函數將其轉換爲鍵入的IEnumerable<T>。例如

IEnumerable e = ...; 
IEnumreable<object> e2 = e.Cast<object>(); 

現在e2IEnumerable<T>,可與所有LINQ職能的工作。

3

您還可以使用LINQ的查詢理解語法,強制轉換爲範圍變量的類型(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的解決方案相同;有關詳細信息,請參見C#語言規範中的7.16.2.2:顯式範圍變量類型

-1

是這樣做,

我給你簡單的例子,以更好地瞭解您

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

'List '已經實現'IEnumerable '哪個OP明確表示它們的對象沒有。 – MEMark