2013-03-11 15 views
7

Mam listę słów na liście. Korzystając z .Contains(), mogę określić, czy słowo znajduje się na liście. Jeśli słowo, które określam, znajduje się na liście, w jaki sposób mogę uzyskać literowatą pisownię słowa z listy? Na przykład .Contains() jest prawdziwe, gdy słowo to "fosforan sodu", ale lista zawiera "fosforan sodu". Jak wykonać wyszukiwanie niewrażliwe na wielkość liter ("fosforan sodu"), ale zwróć z listy dopasowywanie wielkości liter ("fosforan sodu")?Jak uzyskać dopasowanie do wielkości liter na liście <string>?

Wolę unikać słownika, w którym klucz jest pisany wielkimi literami, a wartość jest poprawna, lub werset.

+0

Noty boczne: twój tytuł mówi "wielkość liter", ale wygląda na to, że szukasz czegoś przeciwnego. Czy istnieje jakiś szczególny powód, aby * nie * używać dopasowywania słownika niewrażliwego na wielkość liter? –

+0

@AlexeiLevenkov No cóż, użycie słownika spowodowałoby potrojenie śladu pamięciowego programu zamiast użycia bardziej odpowiedniej (w tym kontekście) metody wyszukiwania. – Servy

+0

@Servy, argee, ale nie używając liniowego wyszukiwania na liście może być użyteczne - nie jest dla mnie całkowicie jasne, czy lista nieuporządkowana jest wymagana. –

Odpowiedz

15

Chcesz coś takiego:

string match = list.FirstOrDefault(element => element.Equals(target, 
            StringComparison.CurrentCultureIgnoreCase)); 

Pozostawi match jako null odniesienia, jeżeli nie stwierdzono zgodności.

(Można użyć List<T>.Find, ale przy użyciu FirstOrDefault czyni kod bardziej ogólnie, jak to będzie działać - z dyrektywy using System.Linq; na początku pliku). Na dowolny sekwencji łańcuchów)

Należy pamiętać, że Zakładam, że nie ma żadnych zerowych elementów na liście. Jeśli chcesz sobie z tym poradzić, możesz zamiast tego użyć statycznego wywołania metody: string.Equals(element, target, StringComparison.CurrentCultureIgnoreCase).

Zauważ, że zakładam, że chcesz porównać kulturowo. Aby uzyskać więcej informacji, zobacz StringComparison.

+0

z ciekawości, dlaczego nie "StringComparison.OrdinalIgnoreCase"? –

+0

+1 Chociaż jest to absolutnie poprawna odpowiedź na to pytanie, zauważ, że wyszukiwanie liniowe na liście nieuporządkowanej nie jest najszybszą operacją - lista budowania 100 elementów w ten sposób może łatwo zmienić się w problem. –

+1

@AlexeiLevenkov Kilkaset nie byłoby problemem. Potrzebujesz setek tysięcy, aby naprawdę stanowił poważny problem. – Servy

0

Zastanów się, czy dla Ciebie jest Dictionary z porównaniem wielkości liter. Jeśli nie dbasz o kolejność słów Dictionary, uzyskasz znacznie lepsze wyniki wyszukiwania niż listy.

Dictionary<string, string> openWith = 
     new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase); 
Powiązane problemy