2010-11-16 23 views
8

Jaki byłby najszybszy sposób sprawdzenia, czy ciąg zawiera jakiekolwiek dopasowania w tablicy ciągów w języku C#? Mogę to zrobić za pomocą pętli, ale myślę, że byłoby zbyt wolno.C# Sprawdź, czy ciąg zawiera jakiekolwiek dopasowania w tablicy łańcuchowej

+3

Dlaczego sądzisz byłoby zbyt wolno? Testowałeś to? Jaki jest typowy rozmiar twojego zestawu danych? Zgadywanie w ten sposób jest stratą czasu. –

+0

Czy możesz wyjaśnić dane wejściowe i pożądany wynik? –

+0

Zawiera około 60 pozycji, ale w tym samym wydarzeniu mam więcej kodu. Wydajność jest w porządku, ale zastanawiałem się, czy mógłbym to zoptymalizować. – david

Odpowiedz

4

Można łączyć ciągi z wyrażeniem regularnym lub instrukcjami, a następnie "robić to w jednym przebiegu", ale technicznie rzecz biorąc, regex nadal wykonuje pętlę wewnętrznie. Ostatecznie, pętla jest konieczna.

+0

W porządku, zrobiłem to z pętlą. – david

+0

@david, nawet regex potrzebuje pętli, myślę, że w większości przypadków jest jeszcze szybszy niż robi to ręcznie. Co więcej, pomaga to w oczyszczeniu kodu, a przez to łatwiejsze do utrzymania, powiedzmy, musisz zmienić kryteria dopasowania. – xandy

+4

Niektórzy ludzie, gdy stają w obliczu problemu, myślą: "Wiem, użyję wyrażeń regularnych."Teraz mają dwa problemy. –

19

Używanie LINQ:

return array.Any(s => s.Equals(myString)) 

prawda, może chcesz wziąć kulturę i sprawy pod uwagę, ale to ogólna idea. Ponadto, jeśli równość nie jest tym, co masz na myśli przez "zapałki", zawsze możesz użyć funkcji, której potrzebujesz do "dopasowania".

+0

Nie wspominając już o tym, że wciąż zapętlasz się - tuż za kulisami. – Dinah

1

Jeśli "tablica" nigdy się nie zmieni (lub zmieni tylko nieczęsto), a będziesz miał wiele ciągów wejściowych, które testujesz przeciwko niemu, to możesz zbudować z tablicy tablicę HashSet<string>. HashSet<T>.Contains jest operacją O (1), w przeciwieństwie do pętli O (N).

Ale potrzeba trochę (małej) ilości czasu na zbudowanie HashSet. Jeśli tablica zmienia się często, to jedyną realistyczną drogą jest pętla.

7

ja naprawdę nie mogę powiedzieć, czy jest to absolutnie najszybszy sposób, ale jeden ze sposobów, jakie powszechnie zrobione to:

Będzie to sprawdzić, jeśli ciąg zawiera którykolwiek z ciągów znaków z tablicy:

string[] myStrings = { "a", "b", "c" }; 
string checkThis = "abc"; 

if (myStrings.Any(checkThis.Contains)) 
{ 
    MessageBox.Show("checkThis contains a string from string array myStrings."); 
} 

aby sprawdzić, czy ciąg zawiera wszystkie sznurki (elementów) z tablicy, wystarczy zmienić myStrings.Any w if do myStrings.All.

Nie wiem, jakiego rodzaju aplikacji jest to, ale często trzeba użyć:

if (myStrings.Any(checkThis.ToLowerInvariant().Contains)) 

Więc jeśli sprawdzamy danych wprowadzonych przez użytkownika, to nie będzie miało znaczenia, czy użytkownik wpisze łańcuch w literach CAPITAL, można to łatwo odwrócić za pomocą ToLowerInvariant().

Mam nadzieję, że to pomogło!

+0

To miło, ale co jeśli chcesz wykonać sprawdzanie w przeciwnym kierunku ... tzn. Sprawdź, czy ten podciąg istnieje w elementach tablicy –

4

To działa dobrze dla mnie:

string[] characters = new string[] { ".", ",", "'" }; 
bool contains = characters.Any(c => word.Contains(c)); 
+0

Z wielu rozwiązań, Jest to jedyny, który działał wewnątrz instrukcji 'Where' w środowisku ASP.NET Core. – VSG24

Powiązane problemy