2010-07-21 14 views
6

Jaki jest najszybszy sposób zaimplementować coś takiego w C#:najszybszy sposób na znalezienie ciągu znaków w języku C#?

private List<string> _myMatches = new List<string>(){"one","two","three"}; 
    private bool Exists(string foo) { 
     return _myMatches.Contains(foo); 
    } 

notatkę, to tylko przykład. wystarczy wykonać filtrowanie niskiego poziomu dla niektórych wartości, które pochodzą z łańcuchów. Mogę je internować, ale nadal muszę wspierać porównanie jednego lub więcej ciągów. Znaczenie: porównywanie ciągów do ciągów (1 filtr) lub ciąg znaków na liście ciągów (wiele filtrów).

+0

wygląda to szybko mi ... – Luiscencio

+0

Szybciej z tym, co pamięć/wstępnego przetwarzania przeciążenie i co ilość dane? –

+0

..... dla list. –

Odpowiedz

17

można zrobić to szybciej za pomocą HashSet<T>, zwłaszcza jeśli masz zamiar być dodanie dużo więcej elementów:

private HashSet<string> _myMatches = new HashSet<string>() { "one", "two", "three" }; 

private bool Exists(string foo) 
{ 
    return _myMatches.Contains(foo); 
} 

Ta wola pokonać List<T> od HashSet<T>.Contains jest operacja O (1).

List<T> Z kolei metoda Contains to O (N). Przeszuka całą listę (aż do znalezienia dopasowania) przy każdym połączeniu. Spowoduje to spowolnienie w miarę dodawania kolejnych elementów.

+1

+1 - Poszedłbym z tym. Nie wygląda na to, że HashTables są odpowiednie, biorąc pod uwagę, że nie przechowują par informacji. Moja natychmiastowa myśl była słownikiem, ale odrzuciłem ją z tego samego powodu, z którego usunąłem HashTable. – BenAlabaster

+0

dziękuję, myślisz, że interning strun może pomóc? –

+0

Kilka pytań: zakłada się, że struktura powinna zawierać tylko unikalne wartości, a czas napełniania i zużycie pamięci są nieistotne. –

0

Tabele skrótów są Twoimi przyjaciółmi dla szybkiego wyszukiwania ciągów znaków.

Zapraszamy do obejrzenia dobrego tutoriala na Working with HashTable in C# 2.0

+2

Lepiej używać HashSet , ponieważ jest to typ bezpieczny i zaprojektowany dokładnie dla tego typu operacji. –

+0

:-) właśnie jesteś –

0

Będziesz musiał profilować. Czy chodzi ci o najszybsze wyszukiwanie (np. Czy licznik czasu inicjalizacji)?

@Elf Król już wspomniano Hash Tables, które miałem zamiar skierować Cię na (konkretnie HashSet<T>)

+0

Tak! HashSet brzmi jak coś dobrego! –

+0

inicjalizacja nie ma znaczenia, po prostu odnośnik. dzięki –

Powiązane problemy