2011-10-13 7 views
59

Mam klasę, która implementuje IEnumerable, ale nie implementuje IEnumerable<T>. Nie mogę zmienić tej klasy i nie mogę użyć innej klasy zamiast niej. Jak już zrozumiałem z MSDN LINQ can be used if class implements IEnumerable<T>. Próbowałem już używać instance.ToQueryable(), ale nadal nie włącza metod LINQ. Wiem na pewno, że ta klasa może zawierać instancje tylko jednego typu, więc klasa może implementować IEnumerable<T>, ale po prostu nie. Co mogę zrobić, aby wysłać zapytanie do tej klasy za pomocą wyrażeń LINQ?Czy LINQ działa z IEnumerable?

+0

Bez odlewania IEnumerable, zamiast wszystkich metod LINQ zobaczysz tylko 8 metod: AsQueryable , Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString – ShawnFeatherly

Odpowiedz

101

Możesz użyć Cast<T>() lub OfType<T>, aby uzyskać ogólną wersję IEnumerable, która w pełni obsługuje LINQ.

Np.

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

Lub jeśli nie wiesz, jaki typ zawiera zawsze można zrobić:

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

Jeśli Twój nierodzajową IEnumerable zawiera obiekty różnych typów i jesteś zainteresowany tylko w np. struny można zrobić:

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

Tak, może. Musisz tylko użyć funkcji Cast, aby przekonwertować ją na wpisaną IEnumerable<T>. Na przykład

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

Teraz e2 jest IEnumerable<T> i może współpracować ze wszystkimi funkcjami LINQ.

3

Można również użyć LINQ jest rozumienie kwerendy składni, która rzuca się do typu zmiennej Range (item w tym przykładzie), czy typ jest określony:

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

Efekt jest identyczny z rozwiązaniem @ JaredPar; zobacz 7.16.2.2: Jawne typy zmiennych zakresu w specyfikacji języka C# w celu uzyskania szczegółowych informacji.

-1

Tak to robi,

dam ci krótki przykład, aby zrozumieć lepszą

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 ' już implementuje 'IEnumerable ', które OP wyraźnie mówi, że ich obiekt nie. – MEMark