2009-03-25 20 views
5

Tengo un conjunto de cadenas (~ 80 000) Solo puedo acceder secuencialmente por el método hits.Doc (int) .Get ("fieldName").¿La forma más rápida de crear una lista de cadenas únicas desde un bucle?

List<string> idStrings = new List<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) 
{ 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.Contains(idString)) 
     idStrings.Add(idString); 
} 

Las cadenas más tarde tendrán que ser int.TryParse() 'd. Creo que debería haber una forma más rápida de hacerlo. ¿Alguna sugerencia?

Respuesta

13

En primer lugar, utilizar un Hashset<string> en lugar de una lista, el método Contains irá más rápido:

int count = hits.Length(); 
Hashset<string> idStrings = new Hashset<string>(); 

EDIT: Usted no tiene que llamar "Contiene" si se utiliza un hashset como pueda no contienen elementos duplicados Simplemente use Agregar, eliminará automáticamente los valores duplicados.

+1

convenidas - List.Contains() es una función O (n). HashSet.Contains es O (1). – itsmatt

+0

Genial, esto es lo que estaba pensando que debería recordar, pero no lo hice. Espero que le haga sentir a cualquiera: P –

+0

Tenga en cuenta que no hay sobrecarga para establecer la capacidad por un int. –

0

La declaración que ralentiza el código es idStrings.Contains(idString).

Puede intentar usar una estructura de datos más rápida que List (¿un árbol o una tabla hash, tal vez?).

Específicamente, necesita una estructura de datos con tiempo de búsqueda sublineal. Las tablas hash tienen un tiempo de búsqueda constante, mientras que los árboles generalmente tienen un tiempo de búsqueda logarítmico.

1

Utilice Dictionary en lugar de List. El método Dictionary.ContainsKey es mucho más rápido que el método List.Contains.

Dictionary<string, int> idStrings = new Dictionary<string, int>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.ContainsKey(idString)) { 
     idStrings.Add(idString, 1); 
    } 
} 

Si utiliza Framework 3.5 se puede utilizar un HashSet en lugar de un Dictionary:

HashSet<string> idStrings = new HashSet<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    idStrings.Add(idString); 
} 
Cuestiones relacionadas