Работает ли LINQ с IEnumerable?
у меня есть класс, который реализует IEnumerable, но не реализует IEnumerable<T>. Я не могу изменить этот класс, и я не могу использовать другой класс вместо него. Как я понял из MSDN LINQ можно использовать, если класс реализует IEnumerable<T>. Я пробовал использовать instance.ToQueryable(), но он по-прежнему не включает методы LINQ. Я точно знаю, что этот класс может содержать экземпляры только одного типа, поэтому класс может реализовать IEnumerable<T>, но это просто не так. Так что я могу сделать, чтобы запросить этот класс с помощью LINQ выражения лица?
4 ответов:
можно использовать
Cast<T>()илиOfType<T>чтобы получить универсальную версию IEnumerable, которая полностью поддерживает LINQ.например.
IEnumerable objects = ...; IEnumerable<string> strings = objects.Cast<string>();или если вы не знаете, какой тип он содержит, вы всегда можете сделать:
IEnumerable<object> e = objects.Cast<object>();если ваш не общий
IEnumerableсодержит объекты различных типов, и вы заинтересованы только в ЭГ. строки, которые вы можете сделать:IEnumerable<string> strings = objects.OfType<string>();
Да, это может. Вам просто нужно использовать
Castфункция, чтобы получить его для преобразования в типизированныйIEnumerable<T>. НапримерIEnumerable e = ...; IEnumreable<object> e2 = e.Cast<object>();теперь
e2- этоIEnumerable<T>и может работать со всеми функциями LINQ.
вы также можете использовать синтаксис понимания запросов 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; см. 7.16.2.2: Явные Типы Переменных Диапазона в спецификации языка C# для деталей.
да,
Я дам вам короткий пример, чтобы понять вас лучше
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; } }
Comments