Mam listę testList
zawierającą kilka ciągów. Chciałbym dodać nowy ciąg do testList
jedynego, jeśli nie istnieje jeszcze na liście. Dlatego muszę przeszukiwać listę bez rozróżniania wielkości liter i sprawić, by była wydajna. Nie mogę używać, Contains
bo to nie uwzględnia obudowy. Nie chcę też używać ToUpper/ToLower
ze względu na wydajność. Trafiłem na tę metodę, która działa:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
To działa, ale dopasowuje również częściowe słowa. Jeśli lista zawiera słowo „koza”, nie mogę dodać słowa „owies”, ponieważ twierdzi, że „owies” jest już na liście. Czy istnieje sposób na efektywne przeszukiwanie list bez rozróżniania wielkości liter, gdzie słowa muszą dokładnie pasować? dzięki
źródło
List<>.Exists(Predicate<>)
metody instancji. Pamiętaj również, że jeśli lista zawieranull
wpisy, może to wybuchnąć. W takim przypadku bezpieczniej jest powiedziećkeyword.Equals(x, StringComparison.OrdinalIgnoreCase)
niżx.Equals(keyword, StringComparison.OrdinalIgnoreCase)
(jeśli możesz zagwarantować, żekeyword
nigdy nie jest zerowy).Zdaję sobie sprawę, że jest to stary post, ale tylko w przypadku ktoś szuka, to można wykorzystać
Contains
poprzez dostarczenie wielkość liter ma znaczenie porównywarka równości ciąg jak w przykładzie:To było dostępne od .net 2.0 zgodnie z msdn .
źródło
StringComparer
Klasa zostało około od 2,0, ale to przeciążenie Zawiera został wprowadzony w 3.5. msdn.microsoft.com/en-us/library/bb339118(v=vs.110).aspxNa podstawie powyższej odpowiedzi Adama Sillsa - oto ładna, czysta metoda rozszerzeń dla Zawartości ... :)
źródło
Możesz użyć StringComparer:
źródło
Na podstawie odpowiedzi Lance'a Larsena - oto metoda rozszerzenia z zalecanym ciągiem znaków: porównaj zamiast ciągów znaków.
źródło
Sprawdzasz, czy wynik IndexOf jest większy lub równy 0, co oznacza, czy dopasowanie zaczyna się w dowolnym miejscu w ciągu. Spróbuj sprawdzić, czy jest równe 0:
Teraz „koza” i „owies” nie będą pasować, ale „koza” i „goa” tak. Aby tego uniknąć, możesz porównać długości dwóch strun.
Aby uniknąć tych wszystkich komplikacji, możesz użyć słownika zamiast listy. Kluczem byłby ciąg małych liter, a wartością byłby prawdziwy ciąg. W ten sposób wydajność nie zaszkodzi, ponieważ nie musisz używać
ToLower
dla każdego porównania, ale nadal możesz używaćContains
.źródło
Poniżej znajduje się przykład wyszukiwania słowa kluczowego na całej liście i usuwania tego elementu:
Jeśli chcesz usunąć książkę, która zawiera słowo kluczowe we właściwości Text, możesz utworzyć listę słów kluczowych i usunąć ją z listy książek:
źródło
Miałem podobny problem, potrzebowałem indeksu pozycji, ale musiał być bez rozróżniania wielkości liter, rozejrzałem się po sieci przez kilka minut i nic nie znalazłem, więc napisałem małą metodę, aby to zrobić, oto co zrobiłem zrobił:
Dodaj ten kod do tego samego pliku i nazwij go w ten sposób:
Mam nadzięję, że to pomogło, powodzenia!
źródło