2013-03-11 3 views
7

Ich habe eine Liste von Wörtern in einer Liste. Mit .Contains() kann ich feststellen, ob ein Wort in der Liste ist. Wenn ein von mir spezifiziertes Wort in der Liste enthalten ist, wie bekomme ich die Groß- und Kleinschreibung des Wortes aus der Liste? Zum Beispiel, .Contains() ist wahr, wenn das Wort "Natriumphosphat" ist, aber die Liste enthält "Natriumphosphat". Wie führe ich eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durch ("Natriumphosphat") und gebe die Groß-/Kleinschreibung ("Natriumphosphat") aus der Liste zurück?Wie bekomme ich die Übereinstimmung in Groß- und Kleinschreibung in Liste <string>?

Ich bevorzuge es, ein Wörterbuch zu vermeiden, in dem der Schlüssel in Großbuchstaben geschrieben ist und der Wert korrekt verkapselt ist, oder umgekehrt.

+0

Seitliche Notizen: Ihr Titel sagt "Groß-/Kleinschreibung", aber es sieht so aus, als ob Sie nach Gegenteil suchen. Gibt es auch einen besonderen Grund, * Dictionary nicht mit Groß- und Kleinschreibung zu verwenden? –

+0

@AlexeiLevenkov Nun, die Verwendung eines Wörterbuchs würde zu einer Verdreifachung des Speicherabdrucks des Programms führen, anstatt die geeignetere (in diesem Kontext) Suchmethode zu verwenden. – Servy

+0

@Servy, Argee, aber nicht mit linearer Suche durch die Liste kann nützlich sein - es ist nicht ganz klar für mich aus der Frage, ob eine ungeordnete Liste die Voraussetzung ist. –

Antwort

15

wollen Sie so etwas wie:

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

Diese match als null Referenz verlassen wird, wenn keine Übereinstimmung gefunden werden kann.

(Sie List<T>.Find verwenden könnte, aber FirstOrDefault Verwendung macht den Code Allgemeinen, wie es funktionieren wird - mit einer using System.Linq; Direktive am Anfang der Datei). Auf jede Folge von Strings)

Beachten Sie, dass Ich nehme an, dass es keine Null-Elemente in der Liste gibt. Wenn Sie damit umgehen möchten, können Sie stattdessen einen statischen Methodenaufruf verwenden: string.Equals(element, target, StringComparison.CurrentCultureIgnoreCase).

Beachten Sie auch, dass ich davon ausgehe, dass Sie einen kultursensitiven Vergleich wünschen. Andere Optionen finden Sie unter StringComparison.

+0

aus Neugier, warum nicht 'StringComparison.OrdinalIgnoreCase'? –

+0

+1 Während das ist absolut richtige Antwort auf die Frage, beachten Sie, dass lineare Suche durch eine ungeordnete Liste ist nicht die schnellste Operation - Aufbau Liste von 100s Elemente auf diese Weise kann leicht zu einem Problem werden. –

+1

@AlexeiLevenkov Ein paar hundert wären überhaupt kein Problem. Sie würden Hunderttausende brauchen, um wirklich ein großes Problem zu sein. – Servy

0

Betrachten Sie, wenn Dictionary mit case insensitive Vergleich für Sie arbeiten. Es sei denn, Sie interessieren sich für die Reihenfolge der Wörter Dictionary wird Ihnen viel bessere Leistung der Suche als Liste geben.

Dictionary<string, string> openWith = 
     new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase); 
Verwandte Themen