2011-10-14 15 views
28

Me preguntaba cuando debería utilizar Lista < cadena> y cuando debería utilizar StringCollection.Rendimiento preocupación: StringCollection vs Lista <String>

Digamos que tengo que lidiar con una gran cantidad de cadenas (como archivos de texto de 10 mb).

sé que Lista < T> proporciona las funciones más potentes que StringCollection.

Pero a veces tipo de encontrar la lista < T>lenta cuando, por ejemplo, decirle a un Gridview que su fuente de datos es una cadena Lista <> ...

también lo hacen Alguien sabe el pros y contras de estas colecciones, con respecto a la velocidad y el peso en la memoria?

En cuanto a sus funcionalidades, estoy seguro de que todos estarán de acuerdo en decir que List es el mejor, así que mi pregunta no es sobre eso. Considere que la pregunta es acerca de los proyectos en Frameworks 4.0, por lo que ambos pueden ser utilizados.

Respuesta

46

yo personalmente preferiría utilizar List<string>:

  • No hay necesidad de recordar un tipo específico sólo para cuerdas
  • Implementa el genérica IEnumerable<T> en lugar de sólo IEnumerable, y por lo tanto es compatible con LINQ
  • Es compatible con SilverLight
  • Es más idiomático para la mayoría de los desarrolladores (IMO)

Estaría realmente sorprendido de encontrar que StringCollection es significativamente más rápido que List<string> - vea si puede respaldar con números.Mi única razón para dudar es que GridView podría tener compatibilidad con código fijo para StringCollection para hacerlo rápido con ese tipo, pero eso me parece poco probable.

+5

¡Ay, eso es! StringCollection no mostraría IEnumerable . Enorme factor. Sí, tira StringCollection de distancia. –

+0

Acerca de la preocupación por la velocidad, noté que cambia mucho, a veces StringCollection es más rápido, a veces es todo lo contrario. Pero, ¿y la memoria? ¿La lista toma más lugar en la memoria que StringCollection? – GianT971

+6

@ GianT971 Si observas el código 'StringCollection' con IlSpy, verás que' StringCollection' es una cuña alrededor de 'ArrayList' que da algunos métodos fuertemente tipados para agregar, eliminar ... Ahora, teniendo en cuenta que' ArrayList' y 'List <>' usa el mismo algoritmo de crecimiento (* 2 de tamaño anterior cada vez) no debería haber ninguna diferencia significativa en la velocidad o el tamaño de la memoria. – xanatos

23

En términos de rendimiento y eficiencia, serán muy similares.

List<string> puede ser un poco más rápido en realidad. Es una especie de envoltorio alrededor de ArrayList pregenérico. No hay boxeo/unboxing, pero aún hay un paso o dos extra bajo el capó, IIRC.

StringCollection fue útil antes de .NET 2.0 porque estaba fuertemente tipeado en la cadena, algo muy común para querer una lista de. Sugeriría usar List<string> ahora. Como la mayoría de los conjuntos de marco y tercera partes hará uso de ella en lugar de StringCollection, esto sería:

  • evitar un montón de fundición
  • evitar alguna confusión. Otros desarrolladores (especialmente los más nuevos) se preguntarían constantemente cuál era la razón para usar StringCollection.
5

La lista < cadena> no es un envoltorio sobre ArrayList. Es una nueva implementación de ArrayList, implementada por tener una matriz (que se redimensiona al tamaño doble cuando el recuento llega a ser más grande que su longitud) y una propiedad de recuento.