none
Retornar objetos de una interfaz RRS feed

  • Pregunta

  • 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.

    jueves, 5 de abril de 2012 8:55

Respuestas

  • 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,



    phurtado
    Mi Blog Blog
    Sigueme en Twitter

    • Marcado como respuesta Jmmontero jueves, 5 de abril de 2012 12:28
    jueves, 5 de abril de 2012 10:10

Todas las respuestas

  • Pues se me ocurre esto

    var p = (from q in list where q.GetType().Name == "NombreDeMiClase" select q);


    Atentamente, Sergio.

    Blog
    Twitter

    • Marcado como respuesta Jmmontero jueves, 5 de abril de 2012 12:28
    • Desmarcado como respuesta Jmmontero jueves, 5 de abril de 2012 12:28
    jueves, 5 de abril de 2012 9:19
  • 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,



    phurtado
    Mi Blog Blog
    Sigueme en Twitter

    • Marcado como respuesta Jmmontero jueves, 5 de abril de 2012 12:28
    jueves, 5 de abril de 2012 10:10
  • 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.

    jueves, 5 de abril de 2012 12:30
  • 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

    viernes, 6 de abril de 2012 17:25