Wie kann ich Array.Contains in einem String-Array unabhängig von Groß- und Kleinschreibung machen?

172

Ich verwende die Array.ContainsMethode für ein String-Array. Wie kann ich die Groß- und Kleinschreibung nicht berücksichtigen?

Mike Cole
quelle

Antworten:

307
array.Contains("str", StringComparer.OrdinalIgnoreCase);

Oder je nach den spezifischen Umständen bevorzugen Sie vielleicht:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);
Mehrdad Afshari
quelle
4
Per msdn.microsoft.com/en-us/library/dd465121.aspx „ die invariante Kultur hat nur sehr wenige Eigenschaften , die es nützlich für den Vergleich machen.“ In fast allen Fällen, in denen Sie keinen kulturspezifischen Vergleich wünschen ( CurrentCulture), sollten Sie Ordinaleher als verwenden InvariantCulture.
Bdukes
2
@bdukes Das ist eine zu starke Aussage. Es gibt gültige Gründe für die Verwendung InvariantCulture. Die Verwendung einer der drei oben genannten Optionen hängt von den Umständen ab. Ich habe keine Einwände gegen Ihre Neuordnung, aber ich entferne den Kommentar "wahrscheinlich nicht". In der Antwort wurde bereits klargestellt, dass Sie diejenige auswählen sollten, die in der aktuellen Situation für Sie funktioniert.
Mehrdad Afshari
1
Es dauerte einen Moment, bis mir klar wurde, dass Contains eine Erweiterungsmethode in System.Linq ist.
Craig Celeste
LINQ, um den Tag wieder zu retten.
Bryantee
@MehrdadAfshari In diesem Fall ist der vorherige Kommentar vollkommen gültig. "Enthält" muss nur die Gleichheit überprüfen, was mit dem Ordnungsvergleich effizienter ist. Die anderen "kulturbewussten" Vergleiche befassen sich mit der Reihenfolge der Zeichen und sind daher nur für die Sortierung relevant.
user1751825
9

Einige wichtige Hinweise von meiner Seite oder zumindest einige verteilte Informationen an einer Stelle - in Bezug auf den obigen Tipp mit einem StringComparer wie in:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() ist eine LINQ-Erweiterungsmethode und funktioniert daher standardmäßig nur mit .NET 3.5 oder höher und benötigt:
    using System;
    using System.Linq;

  2. Aber: In .NET 2.0 ist die einfache Contains()Methode (ohne Berücksichtigung der Groß- und Kleinschreibung) zumindest so möglich, mit einer Besetzung:

    if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

    Da die Contains () -Methode Teil der IList-Schnittstelle ist, funktioniert dies nicht nur mit Arrays, sondern auch mit Listen usw.

Philm
quelle
1

Implementieren Sie einen benutzerdefinierten IEqualityComparer , der die Groß- und Kleinschreibung nicht berücksichtigt.

Überprüfen Sie dies zusätzlich . Dann müssten Sie (theoretisch) nur noch Folgendes tun:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))
Kon
quelle
18
Weil ich bis vor 5 Minuten nicht wusste, dass es einen StringComparer gibt. :)
Kon
0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true
Darin Dimitrov
quelle
4
Aber würde dies nicht einen kostspieligen ToLower () -Aufruf für jedes Element in der Liste durchführen? String.Equals mit der StringComparison-Überladung sind in diesem Beispiel besser geeignet.
Mike Cole