Pregunta

Tengo una larga lista de valores (100-200 cadenas de caracteres) y tengo que devolver una lista distinta de ellos. ¿Cuál es la forma más eficiente de hacer esto utilizando .NET? Las 2 maneras en que puedo pensar son:

  1. Utilice el método Distinct () de la clase IEnumerable
  2. Use un diccionario

Si el enfoque de diccionario es más rápido en términos crudos, considere una decisión disyuntiva alrededor mantenimiento del código.

¿Fue útil?

Solución

Yo esperaría Enumerable.Distinct a ser casi tan rápido como el uso de un diccionario si sólo lo hace una vez. Si usted quiere ser capaz de añadir / quitar los valores y mantener la diferencia-ción, se podría construir una HashSet<string> (que es básicamente lo que espero distinto se hace bajo el capó, pero Distinct(), evidentemente, volver nuevos valores, ya que los encuentra, manteniendo orden.

De hecho, sólo usando:

HashSet<string> distinctItems = new HashSet<string>(list);

habrá una solución bastante buena (y simple) si no le importa el orden de ser desordenado. Es más sencillo de usar un Dictionary, y conceptualmente más limpia, así (como no lo hace realmente desea asignar claves a valores).

(Como siempre, sugeriría encontrar la solución más legible en primer lugar, y referente ella -. Si es "lo suficientemente rápido", entonces ir con eso Si desea utilizar esto como parte de otra consulta, a continuación, Distinct bien puede ser el más forma legible. De lo contrario, me gustaría sugerir HashSet.)

Otros consejos

Me gustaría ir personalmente con el método distinct () proporcionado por LINQ. Es mucho más fácil de leer y mantener. Durante el uso de LINQ será más lento que usar un diccionario la diferencia será pequeña (en el caso que usted ha enumerado) y que sería mejor pasar el tiempo optimizar las consultas de bases de datos o las llamadas de servicio web.

Me siggest que utilice perfiles aquí. Generar una lista con los elementos de la muestra, más o menos es lo que dice 1M veces utilizando en ambos sentidos, y medir el tiempo utilizado por cada sentido.

Si la lectura es una preocupación, crear un método GetDistinctItems y poner su código en su interior.: Código voilà, auto-documentado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top