Necesito un método rápido para determinar si una cadena dada se encuentra en una lista de cadenas.Comparación rápida de cadenas con la lista
La lista de cadenas no se conoce hasta el tiempo de ejecución, pero a partir de entonces no cambiará.
yo podría simplemente tener un List<String>
llamados strings
y luego hacer:
if (strings.Contains(item))
Sin embargo, esto no rinden adecuadamente si hay muchas cadenas de la lista.
También podría utilizar un HashSet<String>
, pero para ello sería necesario llamar GetHashCode
en cada cuerda entrante, así como Equals
, lo que sería un desperdicio si hay, por ejemplo, solo 3 cadenas en la lista. ¿Mencioné que esto debe ser rápido?
que pude en la configuración y decide utilizar un List
o una HashSet
dependiendo del número de cadenas (por ejemplo, el uso de lista por menos de 10 cuerdas, HashSet de otra manera), algo así como la lógica en HybridDictionary
.
Como las cadenas son unicode, una estructura Trie estándar no funcionará, aunque un árbol Radix/Patricia trie podría. ¿Hay alguna buena implementación de C# con benchmarks?
Algunos han mencionado pasar por alto String
's GetHashCode
y utilizando una función hash de más rápido rendimiento. ¿Hay puntos de referencia por ahí?
El uso de expresiones LINQ para crear esencialmente una declaración de conmutación optimizada es un enfoque novedoso que se ve muy interesante.
¿Qué más podría funcionar? El costo de instalación no es importante, solo la velocidad de búsqueda.
Si es importante, los valores de las cadenas entrantes raramente aparecerán en la lista.
He actualizado mi respuesta para incluir enlaces a información sobre intentos plegados para Unicode. –