2009-03-25 23 views
5

Ho un set di stringhe (~ 80.000) Posso accedere solo in sequenza dal metodo hits.Doc (int) .Get ("fieldName").Il modo più veloce per creare un elenco di stringhe univoche da un loop?

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); 
} 

Le stringhe in seguito dovranno essere int.TryParse() 'd. Penso che ci dovrebbe essere un modo più veloce per farlo. Eventuali suggerimenti?

risposta

13

Prima di tutto, utilizzare un Hashset<string> invece di una lista, il metodo Contains andrà più veloce:

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

EDIT: Non dovete chiamare "Contiene" se si utilizza un hashset come può contenere oggetti duplicati Basta usare Aggiungi, rimuoverà automaticamente i valori duplicati.

+1

concordati - List.Contains() è una funzione O (n). HashSet.Contains è O (1). – itsmatt

+0

Grande, questo è quello che stavo pensando che dovrei ricordare, ma non lo fece. Spero che questo renda conto a chiunque: P –

+0

Si noti che non c'è sovraccarico per impostare la capacità di un int. –

0

La dichiarazione che rallenta il codice è idStrings.Contains(idString).

È possibile provare a utilizzare una struttura dati più veloce rispetto a List (una tabella ad albero o una tabella hash, forse?).

In particolare, è necessaria una struttura dati con tempo di ricerca sublimatico. Le tabelle hash hanno un tempo di ricerca costante, mentre gli alberi di solito hanno un tempo di ricerca logaritmico.

1

Utilizzare uno Dictionary anziché uno List. Il metodo Dictionary.ContainsKey è molto più veloce del metodo 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); 
    } 
} 

Se si utilizza Framework 3.5 è possibile utilizzare un HashSet invece di 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); 
} 
Problemi correlati