2009-03-25 14 views
5

Mam zestaw ciągów (~ 80 000) Mogę uzyskać dostęp tylko sekwencyjnie przez metodę hits.Doc (int) .Get ("fieldName").Najszybszy sposób tworzenia listy unikatowych ciągów z pętli?

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

Ciągi będą później musiały być int.TryParse() "d. Myślę, że powinien istnieć szybszy sposób na zrobienie tego. Jakieś sugestie?

Odpowiedz

13

Przede wszystkim, należy użyć Hashset<string> zamiast liście, Zawiera metoda będzie jechać szybciej:

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

EDIT: Nie musisz nazywać „zawiera”, jeśli używasz Hashset jak to możliwe nie zawierają duplikatów. Wystarczy użyć opcji Dodaj, spowoduje to automatyczne usunięcie zduplikowanych wartości.

+1

Uzgodnione - List.Contains() jest funkcją O (n). HashSet.Contains to O (1). – itsmatt

+0

Wspaniale, to, o czym myślałem, że powinienem pamiętać, ale nie. Nadzieja, która sprawia, że ​​każdy: P –

+0

Należy pamiętać, że nie ma przeciążenia, aby ustawić pojemność przez int. –

0

Instrukcja spowalniająca twój kod to idStrings.Contains(idString).

Możesz spróbować użyć szybszej struktury danych niż List (może to być drzewo lub tablica skrótów?).

W szczególności potrzebna jest struktura danych z sublinearnym czasem wyszukiwania. Tabele skrótu mają stały czas wyszukiwania, podczas gdy drzewa mają zwykle logarytmiczny czas wyszukiwania.

1

Użyj Dictionary zamiast List. Metoda Dictionary.ContainsKey jest znacznie szybsza niż metoda 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); 
    } 
} 

Jeśli używasz Framework 3.5 można użyć HashSet zamiast 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); 
} 
Powiązane problemy