none
Como recorrer una List<T> RRS feed

  • Pregunta

  • Hola, les cuento tengo una clase A que tiene una lista, pasa que esta lista generalmente es un List<B> pero a veces me resulta largo el proceso de codificacion ya que no es necesaria utilizar una List<B> sino basta con emplear una List<string>. ¿Se entiende?

    Entonces me gustaria definir mi clase A como sigue:

    public class A
    {
    protected List<T> lista;
    
    public List<T> Lista
    {
    get
    {
    return this.lista;
    }
    set
    {
    this.lista= value;
    }
    }
    }
    

    Lo que no se es como hacer la definicion de la clase, y tampoco luego como recorrer tal Lista. Aqui tengo un codigo de lo que actualmente estoy realizando.

    if (this.lista is List<B>)
    {
    List<B> list_B = this.lista as List<B>;
    foreach (B b in list_B)
    b.Tarea();
    }
    else if (this.lista is List<string>)
    {
    List<string> list_S = this.lista as List<string>;
    foreach (string s in list_S)
    Console.WriteLine(s);
    }

    Saludos.

     

     

    viernes, 22 de julio de 2011 15:48

Respuestas

  • hola

    no deberia ser

    public class AClass<T> where T : new()
    {
        protected List<T> lista;

        public  AClass(){

             this.lista= new List<T>();
        }


        public List<T> Lista
        {
        get
        {
            return this.lista;
        }
        set
        {
            this.lista= value;
        }
        }
    }

     

    public class BClass{

    }

     

    entonces cuando declaras

    AClass<BClass> _a = new AClass<BClass>();

    foreach(B itemB in _a.Lista){

    }

     

    Nota: usa nombres que diferencien un poco porque sino te podria confundir

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta el oberto viernes, 22 de julio de 2011 20:47
    viernes, 22 de julio de 2011 16:05
  • Hola, sin duda el foreach es mejor, pues el se autoadministra y no tienes que preocuparte por una execpcion de fuera de rango

    Saludos.


    Nicolás Herrera
    Bogotá - Colombia
    BLOG - Leader Group BogotaDotNet
    "Daría todo lo que sé, por la mitad de lo que ignoro." Rene Descartes
    • Marcado como respuesta el oberto viernes, 22 de julio de 2011 20:47
    viernes, 22 de julio de 2011 19:04

Todas las respuestas

  • hola

    no deberia ser

    public class AClass<T> where T : new()
    {
        protected List<T> lista;

        public  AClass(){

             this.lista= new List<T>();
        }


        public List<T> Lista
        {
        get
        {
            return this.lista;
        }
        set
        {
            this.lista= value;
        }
        }
    }

     

    public class BClass{

    }

     

    entonces cuando declaras

    AClass<BClass> _a = new AClass<BClass>();

    foreach(B itemB in _a.Lista){

    }

     

    Nota: usa nombres que diferencien un poco porque sino te podria confundir

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta el oberto viernes, 22 de julio de 2011 20:47
    viernes, 22 de julio de 2011 16:05
  • Ok.

    Segun me dices, cambie la definicion de mi clase AClass como me sugieres, pero ahora tengo otra duda.

    Como itero la lista desde dentro la clase AClass, porque en esta clase el elemento es T, ya que el "is" no me funciona.

    Saludos.

    viernes, 22 de julio de 2011 17:16
  • public class AClass<T> where T : new()
    {
        protected List<T> lista;

        public  AClass(){

             this.lista= new List<T>();
        }


        public List<T> Lista
        {
        get
        {
            return this.lista;
        }
        set
        {
            this.lista= value;
        }
        }

        public void Process(){

            foreach(T item in this.lista){

            }

        }


    }

     

    por supuesto si cada clase template que defines en T tiene propiedades distintas que debes trabajar la cosa se complica, pero si defiens una interfaz comun

    interface IClass{

        string NomProp {get;set;}

    }

    public class BClass : IClass{

       public string NomProp {get;set;}

    }

     

    public class AClass<T> where T : IClass, new()
    {
        protected List<T> lista;

        public  AClass(){

             this.lista= new List<T>();
        }


        public List<T> Lista
        {
        get
        {
            return this.lista;
        }
        set
        {
            this.lista= value;
        }
        }

        public void Process(){

            foreach(T item in this.lista){

                IClass temp = (IClass)item;

                temp.NomProp = valor;

            }

        }


    }

     

    como veras ahora normalzias algo mas el uso de esta clase para acotar que se puede pasar en el generico

    Nota: los nombres que uses son solo de referencia despues peude usar los que guste


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 22 de julio de 2011 17:22
  • Ok. Resolvi lo del recorrer la Lista. Ahora en el ciclo, tengo que saber si el elemento es el primer elemento de la Lista.

    foreach(T item in this.lista){

    if(this.lista.IndexOf(item) == 0)

    Algo();

    }

    o

    for(int i = 0; i<this.lista.Count; i++)

    {

    if(i==0)

    Algo();

    }

    Tengo estas dos ciclos que hacen lo mismo, cual seria el de mejor rendimiento.

    Saludos.

    viernes, 22 de julio de 2011 17:58
  • Hola, sin duda el foreach es mejor, pues el se autoadministra y no tienes que preocuparte por una execpcion de fuera de rango

    Saludos.


    Nicolás Herrera
    Bogotá - Colombia
    BLOG - Leader Group BogotaDotNet
    "Daría todo lo que sé, por la mitad de lo que ignoro." Rene Descartes
    • Marcado como respuesta el oberto viernes, 22 de julio de 2011 20:47
    viernes, 22 de julio de 2011 19:04
  • hola

    pero no entendi

    porque necesitas saber si es el primero ? pero bueno como lo haces con el for es valido, o tambien con algun flag en el  foraech se podria haber logrado

    for(int i = 0; i<this.lista.Count; i++)

    {

        if(i==0){

          T item= lista[i];

         }

    }

     

    asi tomas el valor segun el indice

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 22 de julio de 2011 19:32
  • Necesito saber el primero por un caso en particular de mi problema.

    Gracias a los dos por las ayudas.

    Saludos.

    viernes, 22 de julio de 2011 20:47