none
¿Cuál de estas asignaciones es más eficiente? Suponiendo que deseo asignar la siguiente lista a otra lista. RRS feed

  • Pregunta

  • Suponiendo que declaro:

    Dim ListaTotal As ClaseElementos    'Y que la lleno con unos diez mil elementos.


    Y deseo filtrar ListaTotal y el resultado asignarlo a Lista. ¿Cuál de las dos asignaciones resulta más eficiente?

    ¿Esta?:

    Dim Lista As ClaseElementos

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA)

    --------------------------------------------

    ¿O esta?:

    Dim Lista As New ClaseElementos

    Lista.AddRange(ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA))

    Creo que la primera ¿no?

    • Editado James2016-2 viernes, 4 de diciembre de 2020 19:21
    viernes, 4 de diciembre de 2020 19:19

Respuestas

  • Viene a dar lo mismo, una vez que corrijas el error.

    Concretamente, en esta variante:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA)

    en realidad lo que tienes que hacer es esto:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA).ToList()

    debido a que el GroupBy no devuelve una lista sino un IEnumerable, y entonces el IEnumerable tienes que convertirlo a lista con .ToList(). Esa conversión implica instanciar el List y recorrer el IEnumerable para meter los elementos en el List.

    Y eso es exactamente lo mismo que hace la otra variante:

    Lista.AddRange(ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA))

    que también tiene que instanciar un List y enumerar el IEnumerable para cargar cada elemento en el List.

    Ahora bien, dicho lo anterior, hay una posibilidad de que el extensor Linq "ToList" tenga internamente la inteligencia necesaria para darse cuenta de si el IEnumerable que le llega es precisamente un List y en ese caso convertirlo mediante un "cast", sin enumerarlo. En el caso de que la implementación interna del GroupBy utilice un List, y que el ToList tenga dicha optimización, el primer método sería más eficiente. Pero todo esto es una suposición; no sabemos cuál es en realidad la implementación interna del GroupBy y si usa un List o no.

    • Marcado como respuesta James2016-2 viernes, 4 de diciembre de 2020 22:46
    viernes, 4 de diciembre de 2020 21:08

Todas las respuestas

  • Viene a dar lo mismo, una vez que corrijas el error.

    Concretamente, en esta variante:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA)

    en realidad lo que tienes que hacer es esto:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA).ToList()

    debido a que el GroupBy no devuelve una lista sino un IEnumerable, y entonces el IEnumerable tienes que convertirlo a lista con .ToList(). Esa conversión implica instanciar el List y recorrer el IEnumerable para meter los elementos en el List.

    Y eso es exactamente lo mismo que hace la otra variante:

    Lista.AddRange(ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA))

    que también tiene que instanciar un List y enumerar el IEnumerable para cargar cada elemento en el List.

    Ahora bien, dicho lo anterior, hay una posibilidad de que el extensor Linq "ToList" tenga internamente la inteligencia necesaria para darse cuenta de si el IEnumerable que le llega es precisamente un List y en ese caso convertirlo mediante un "cast", sin enumerarlo. En el caso de que la implementación interna del GroupBy utilice un List, y que el ToList tenga dicha optimización, el primer método sería más eficiente. Pero todo esto es una suposición; no sabemos cuál es en realidad la implementación interna del GroupBy y si usa un List o no.

    • Marcado como respuesta James2016-2 viernes, 4 de diciembre de 2020 22:46
    viernes, 4 de diciembre de 2020 21:08
  • Viene a dar lo mismo, una vez que corrijas el error.

    Concretamente, en esta variante:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA)

    en realidad lo que tienes que hacer es esto:

    Lista = ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA).ToList()

    debido a que el GroupBy no devuelve una lista sino un IEnumerable, y entonces el IEnumerable tienes que convertirlo a lista con .ToList(). Esa conversión implica instanciar el List y recorrer el IEnumerable para meter los elementos en el List.

    Y eso es exactamente lo mismo que hace la otra variante:

    Lista.AddRange(ListaTotal.GroupBy(AQUI UN COMANDO QUE AGRUPA))

    que también tiene que instanciar un List y enumerar el IEnumerable para cargar cada elemento en el List.

    Ahora bien, dicho lo anterior, hay una posibilidad de que el extensor Linq "ToList" tenga internamente la inteligencia necesaria para darse cuenta de si el IEnumerable que le llega es precisamente un List y en ese caso convertirlo mediante un "cast", sin enumerarlo. En el caso de que la implementación interna del GroupBy utilice un List, y que el ToList tenga dicha optimización, el primer método sería más eficiente. Pero todo esto es una suposición; no sabemos cuál es en realidad la implementación interna del GroupBy y si usa un List o no.

    Cierto, se me fue el ToList(), mm entonces en todo caso no queda otra que probar midiendo el tiempo de ejecución de cada una. Se me ocurre que quizá haciendo varias asignaciones para ver cuál tarda menos.
    viernes, 4 de diciembre de 2020 22:46
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    sábado, 5 de diciembre de 2020 0:20
    Moderador