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?
Odpowiedz
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>();
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.
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.
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; }
}
'List
Bez odlewania IEnumerable, zamiast wszystkich metod LINQ zobaczysz tylko 8 metod: AsQueryable , Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString – ShawnFeatherly