Retornar objetos de una interfaz
-
jueves, 05 de abril de 2012 8:55
Buenos días,
Estoy trabajando con una lista de una interfaz que implementan varias clases. Yo voy guardando dentro de esa lista todos los objetos que voy creando de las clases. En un momento, necesito recuperar los objetos creados de una clase determinada.
Actualmente lo hago mediante un For Each que recorre la lista de la interfaz y recupera los objetos necesarios de cada uno de los tipos. Pero me gustaría saber si hay alguna manera de hacerlo con Linq.
Muchas gracias.
Un saludo.
Todas las respuestas
-
jueves, 05 de abril de 2012 9:19
Pues se me ocurre esto
var p = (from q in list where q.GetType().Name == "NombreDeMiClase" select q);
-
jueves, 05 de abril de 2012 10:10
Hola,
Imagino que tendrás definido algo parecido a esto.
public interface IInterface { string Propiedad { get; set; } } public class ClaseA : IInterface { public string Propiedad { get; set; } } public class ClaseB : IInterface { public string Propiedad { get; set; } }
La forma de seleccionar todos los elementos de una lista que sean del tipo ClaseA podría ser de esta forma.
List<IInterface> Lista = new List<IInterface>() { new ClaseA(), new ClaseB(), }; Lista.OfType<ClaseA>().ToList().ForEach((c)=>c.Propiedad = "Hola");O bien retornar los valores a un IEnumerable<T> e iterar por ellos con un foreach.
var resultado = Lista.OfType<ClaseA>(); foreach (var item in resultado) { item.Propiedad = "Hola"; }Lo que más te guste:)
En este link tienes la referencia Enumerable.OfType<tresult>(Método)</tresult>
Saludos,
- Marcado como respuesta Jmmontero jueves, 05 de abril de 2012 12:28
-
jueves, 05 de abril de 2012 12:30
Las dos respuestas me resultan geniales. Pero sin embargo, creo que me voy a quedar con la de Pedro Hurtado.
Yo quería recolectar los valores de la clase A y realizar una lambda como esto:
this.OfType<ClaseB>().ToList().FindAll(x => x.Param == file.Param).Count > 0
Funciona perfectamente.
Muchas gracias a los dos!
Saludos.
-
viernes, 06 de abril de 2012 17:25
De todas formas si quieres una solución más linq con sintaxis tipo SQL, puedes utilizar (siguiendo el buen ejemplo de Pedro Hurtado):
List<IInterface> lista = new List<IInterface>() { new ClaseA() { Propiedad = "Hola" }, new ClaseB() { Propiedad = "Adios"}, }; var result = ( from i in lista where (i.Propiedad == "Hola") && (i is ClaseB) select i ).ToList();En este ejemplo result tiene 0 elementos, ya que el elemento que tiene la propiedad == "Hola" es de tipo ClaseA
Saludos

