3461 Stimmen

Groß-/Kleinschreibung unempfindlich 'Enthält(string)'

Gibt es eine Möglichkeit, den folgenden Wert auf true zu setzen?

string title = "ASTRINGTOTEST";
title.Contains("string");

Es scheint keine Funktion zu geben, mit der ich die Groß- und Kleinschreibung einstellen kann. Zurzeit schreibe ich beide mit GROSSSCHREIBUNG, aber das ist einfach dumm (womit ich mich auf die i18n Probleme, die mit der Verkleidung nach oben und unten verbunden sind).

UPDATE

Diese Frage ist uralt, und inzwischen ist mir klar geworden, dass ich um eine einfache Antwort auf ein wirklich umfangreiches und schwieriges Thema gebeten habe, wenn man sich eingehend damit befassen möchte.

Für die meisten Fälle, in einsprachigen, englischen Codebasen este Antwort wird ausreichen. Ich vermute, weil die meisten Menschen, die hierher kommen, in diese Kategorie fallen, ist dies die beliebteste Antwort.

Diese Antwort wirft jedoch das inhärente Problem auf, dass wir Texte nicht ohne Berücksichtigung der Groß- und Kleinschreibung vergleichen können, solange wir nicht wissen, dass beide Texte aus der gleichen Kultur stammen und wir wissen, was diese Kultur ist. Dies ist vielleicht eine weniger populäre Antwort, aber ich denke, sie ist richtiger und deshalb habe ich sie als solche markiert.

1 Stimmen

Versuchen Sie dies: Yourculture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

104voto

Ed S. Punkte 118985

Sie können die Saiten immer zuerst hoch- oder runterklappen.

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

Ups, ich habe gerade den letzten Teil gesehen. Ein Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung würde * wahrscheinlich * Wenn die Leistung kein Problem darstellt, sehe ich kein Problem darin, Kopien in Großbuchstaben zu erstellen und diese zu vergleichen. Ich könnte schwören, dass ich einmal einen Vergleich ohne Groß- und Kleinschreibung gesehen habe...

4 Stimmen

Interessanterweise habe ich gesehen, dass ToUpper() in dieser Art von Szenario der Verwendung von ToLower() vorgezogen wird, da ToLower() in bestimmten Kulturen anscheinend die "Treue" verlieren kann - d. h. zwei verschiedene Großbuchstaben werden in denselben Kleinbuchstaben übersetzt.

145 Stimmen

Suche nach "Türkei-Test" :)

10 Stimmen

In einigen französischen Sprachräumen haben Großbuchstaben keine diakritischen Zeichen, so dass ToUpper() möglicherweise nicht besser ist als ToLower(). Ich würde sagen, verwenden Sie die richtigen Werkzeuge, wenn sie verfügbar sind - case-insensitive compare.

55voto

FeiBao 飞豹 Punkte 753

Ein Problem mit der Antwort ist, dass sie eine Ausnahme auslöst, wenn eine Zeichenkette null ist. Sie können das als Prüfung hinzufügen, damit es nicht passiert:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return true;

    return source.IndexOf(toCheck, comp) >= 0;
}

9 Stimmen

Wenn toCheck die leere Zeichenkette ist, muss es laut der Contains-Dokumentation true zurückgeben: "true, wenn der Parameter value in dieser Zeichenkette vorkommt, oder wenn value die leere Zeichenkette ist (""); andernfalls false."

4 Stimmen

Muss der vorgeschlagene Code aufgrund des obigen Kommentars von amurra nicht korrigiert werden? Und sollte dies nicht der akzeptierten Antwort hinzugefügt werden, so dass die beste Antwort an erster Stelle steht?

17 Stimmen

Jetzt wird true zurückgegeben, wenn source eine leere Zeichenkette oder null ist, egal was toCheck ist. Das kann nicht korrekt sein. Auch IndexOf gibt bereits true zurück, wenn toCheck eine leere Zeichenkette ist und source nicht null ist. Was hier benötigt wird, ist eine Prüfung auf null. Ich schlage vor, dass if (source == null || value == null) false zurückgibt;

42voto

Andrew Punkte 9747

StringExtension Klasse ist der Weg nach vorn, ich habe ein paar der Beiträge oben kombiniert, um ein komplettes Code-Beispiel zu geben:

public static class StringExtensions
{
    /// <summary>
    /// Allows case insensitive checks
    /// </summary>
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}

1 Stimmen

Warum erlauben Sie eine weitere Abstraktionsebene über StringComparison ?

2 Stimmen

Denn das vereinfacht sowohl das Lesen als auch das Schreiben des Codes. Es imitiert im Wesentlichen das, was spätere Versionen von .Net direkt zur Klasse hinzugefügt haben. Es spricht viel für einfache Komfortmethoden, die Ihr Leben und das Leben anderer einfacher machen, auch wenn sie ein wenig mehr Abstraktion bedeuten.

36voto

Fabian Bigler Punkte 9589

OrdinalIgnoreCase, CurrentCultureIgnoreCase oder InvariantCultureIgnoreCase?

Da dies nicht der Fall ist, finden Sie hier einige Empfehlungen, wann Sie welches Instrument verwenden sollten:

Dos

  • Verwenden Sie StringComparison.OrdinalIgnoreCase für Vergleiche als sicheren Standard für kulturunabhängigen String-Abgleich.
  • Verwenden Sie StringComparison.OrdinalIgnoreCase Vergleiche für mehr Geschwindigkeit.
  • Verwenden Sie StringComparison.CurrentCulture-based String-Operationen wenn die Ausgabe für den Benutzer angezeigt wird.
  • Umschalten der derzeitigen Verwendung von String-Operationen auf der Grundlage der invarianten Kultur auf die Verwendung der nicht-linguistischen StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase wenn der Vergleich
    sprachlich irrelevant (z. B. symbolisch).
  • Verwenden Sie ToUpperInvariant statt ToLowerInvariant wenn Normalisierung von Zeichenketten für den Vergleich.

Was man nicht tun sollte

  • Verwenden Sie Überladungen für String-Operationen, die nicht explizit oder implizit den String-Vergleichsmechanismus angeben.
  • Verwenden Sie StringComparison.InvariantCulture -basierte Zeichenfolge
    Operationen in den meisten Fällen; eine der wenigen Ausnahmen wäre
    sprachlich aussagekräftige, aber kulturunabhängige Daten zu erhalten.

Nach diesen Regeln sollten Sie vorgehen:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
    // The string exists in the original
}

in der Erwägung, dass [IhreEntscheidung] von den oben genannten Empfehlungen abhängt.

Link zur Quelle: http://msdn.microsoft.com/en-us/library/ms973919.aspx

1 Stimmen

Was ist, wenn Sie wissen, dass Sie immer eine englische Zeichenkette erhalten werden. welche soll ich verwenden?

2 Stimmen

@BKSpurgeon Ich würde OrdinalIgnoreCase verwenden, wenn die Groß-/Kleinschreibung keine Rolle spielt.

1 Stimmen

Warum bevorzugen wir ToUpperInvariant gegenüber ToLowerInvariant?

36voto

takirala Punkte 1791

Das ist sauber und einfach.

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)

34 Stimmen

Dies wird jedoch mit einem Muster übereinstimmen. In Ihrem Beispiel, wenn fileNamestr irgendwelche speziellen Regex-Zeichen enthält (z.B. * , + , . usw.), dann werden Sie eine ziemliche Überraschung erleben. Die einzige Möglichkeit, diese Lösung wie eine richtige Lösung funktionieren zu lassen Contains Funktion ist es, zu entkommen fileNamestr indem ich Regex.Escape(fileNamestr) .

2 Stimmen

Außerdem ist das Parsen und Abgleichen eines Regex sehr viel ressourcenintensiver als ein einfacher Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X