Gibt es eine Möglichkeit, die folgende Rückgabe wahr zu machen?
string title = "ASTRINGTOTEST";
title.Contains("string");
Es scheint keine Überlastung zu geben, die es mir ermöglicht, die Groß- und Kleinschreibung zu ändern. Derzeit überschreibe ich beide, aber das ist nur albern (womit ich mich auf die i18n- Probleme beziehe, die mit dem Auf- und Ab-Gehäuse einhergehen).
UPDATE
Diese Frage ist uralt und seitdem habe ich festgestellt, dass ich nach einer einfachen Antwort für ein wirklich umfangreiches und schwieriges Thema gefragt habe, wenn Sie es vollständig untersuchen möchten.
In den meisten Fällen reicht diese Antwort in einsprachigen englischen Codebasen aus. Ich vermute, weil die meisten Leute, die hierher kommen, in diese Kategorie fallen, ist dies die beliebteste Antwort.
Diese Antwort wirft jedoch das inhärente Problem auf, dass wir Text ohne Berücksichtigung der Groß- und Kleinschreibung nicht vergleichen können, bis wir wissen, dass beide Texte dieselbe Kultur sind und wir wissen, was diese Kultur ist. Dies ist vielleicht eine weniger beliebte Antwort, aber ich denke, sie ist korrekter und deshalb habe ich sie als solche markiert.
quelle
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Dies verwendet die richtige Kultur und unterscheidet nicht zwischen Groß- und Kleinschreibung, weist keine temporären Kleinbuchstaben zu und vermeidet die Frage, ob das Konvertieren in Kleinbuchstaben und das Vergleichen immer mit einem Vergleich ohne Berücksichtigung von Groß- und Kleinschreibung identisch sind.Sie können die String.IndexOf-Methode verwenden und
StringComparison.OrdinalIgnoreCase
als zu verwendenden Suchtyp übergeben :Noch besser ist es, eine neue Erweiterungsmethode für Zeichenfolgen zu definieren:
Beachten Sie, dass die Nullweitergabe
?.
seit C # 6.0 (VS 2015) für ältere Versionen verfügbar istVERWENDUNGSZWECK:
quelle
paragraph.ToLower(culture).Contains(word.ToLower(culture))
beiCultureInfo.InvariantCulture
und löst keine Lokalisierungsprobleme. Warum überkomplizieren? stackoverflow.com/a/15464440/284795ToLower
Version enthält 2 Zuordnungen, die bei einem Vergleichs- / Suchvorgang nicht erforderlich sind. Warum in einem Szenario, das es nicht erfordert, unnötig zuordnen?string
es ein ist,IEnumerable<char>
daher können Sie es nicht verwenden, umstring.IndexOf(string)
wird die aktuelle Kultur verwendet, während standardmäßigstring.Contains(string)
der Ordnungsvergleich verwendet wird. Wie wir wissen, kann Ersteres geändert werden, indem eine längere Überlastung ausgewählt wird, während Letzteres nicht geändert werden kann. Eine Folge dieser Inkonsistenz ist das folgende Codebeispiel:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Sie können
IndexOf()
wie folgt verwenden:Da 0 (Null) ein Index sein kann, prüfen Sie gegen -1.
MSDN
quelle
Alternative Lösung mit Regex:
quelle
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
für jeden, der hilft."."
in zu suchen"This is a sample string that doesn't contain the search string"
. Oder versuchen Sie es zu suchen"(invalid"
.Regex.Escape
könnte helfen. Regex scheint immer noch unnötig zu sein, wennIndexOf
/ extensionContains
einfach (und wohl klarer) ist.Sie können die Zeichenfolgen immer zuerst nach oben oder unten verschieben.
Hoppla, habe gerade das letzte bisschen gesehen. Ein Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung würde
*
wahrscheinlich*
sowieso dasselbe tun, und wenn die Leistung kein Problem darstellt, sehe ich kein Problem beim Erstellen und Vergleichen von Großbuchstaben. Ich hätte schwören können, dass ich einmal einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung gesehen habe ...quelle
Nur .NET Core 2.0+ (ab sofort)
.NET Core verfügt seit Version 2.0 über zwei Methoden, um damit umzugehen:
Beispiel:
Mit der Zeit werden sie wahrscheinlich den Weg in den .NET-Standard und von dort in alle anderen Implementierungen der Basisklassenbibliothek finden.
quelle
Ein Problem mit der Antwort ist, dass eine Ausnahme ausgelöst wird, wenn eine Zeichenfolge null ist. Sie können das als Scheck hinzufügen, damit es nicht:
quelle
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
Die StringExtension-Klasse ist der Weg nach vorne. Ich habe einige der obigen Beiträge kombiniert, um ein vollständiges Codebeispiel zu erhalten:
quelle
StringComparison
?Das ist sauber und einfach.
quelle
fileNamestr
spezielle Regex Zeichen hat (zB*
,+
,.
, etc.) , dann werden Sie in für eine ziemliche Überraschung sein. Die einzige Möglichkeit, diese Lösung wie eine ordnungsgemäßeContains
Funktion funktionieren zu lassen, besteht darin,fileNamestr
durch Ausführen zu entkommenRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase oder InvariantCultureIgnoreCase?
Da dies fehlt, finden Sie hier einige Empfehlungen, wann Sie welche verwenden sollten:
DOS
StringComparison.OrdinalIgnoreCase
für Vergleiche als sichere Standardeinstellung für den kulturunabhängigen String-Abgleich.StringComparison.OrdinalIgnoreCase
Vergleiche für eine höhere Geschwindigkeit.StringComparison.CurrentCulture-based
Zeichenfolgenoperationen, wenn Sie dem Benutzer die Ausgabe anzeigen.StringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
wenn der Vergleichsprachlich irrelevant ist (z. B. symbolisch).
ToUpperInvariant
statt ,ToLowerInvariant
wenn Normalisierungs Saiten zum Vergleich.Nicht
StringComparison.InvariantCulture
Zeichenfolgen basierende Zeichenfolgenoperationen. Eine der wenigen Ausnahmen wäre das
Fortbestehen sprachlich bedeutsamer, aber kulturell agnostischer Daten.
Basierend auf diesen Regeln sollten Sie Folgendes verwenden:
[YourDecision] hängt von den Empfehlungen von oben ab.
Link zur Quelle: http://msdn.microsoft.com/en-us/library/ms973919.aspx
quelle
Dies sind die einfachsten Lösungen.
Nach Index von
Durch Ändern des Falls
Von Regex
quelle
Ich weiß, dass dies nicht das C # ist, aber im Framework (VB.NET) gibt es bereits eine solche Funktion
C # -Variante:
quelle
Die
InStr
Methode aus der VisualBasic-Assembly ist die beste, wenn Sie Bedenken hinsichtlich der Internationalisierung haben (oder diese erneut implementieren könnten). Ein Blick darauf zeigt, dass dotNeetPeek nicht nur Großbuchstaben und Kleinbuchstaben berücksichtigt, sondern auch Zeichen vom Typ Kana und Zeichen voller oder halber Breite (meistens relevant für asiatische Sprachen, obwohl es auch Versionen des römischen Alphabets in voller Breite gibt ). Ich überspringe einige Details, aber schau dir die private Methode anInternalInStrText
:quelle
Genau wie dieser:
quelle
Benutze das:
quelle
Contains
nichtCompare
.Contains
mitIndexOf
. Dieser Ansatz ist also ebenso hilfreich! Das C # -Codebeispiel auf dieser Seite verwendet string.Compare (). Die Wahl des SharePoint-Teams!Dies ist einem anderen Beispiel hier ziemlich ähnlich, aber ich habe beschlossen, die Aufzählung auf bool zu vereinfachen, primär, da andere Alternativen normalerweise nicht benötigt werden. Hier ist mein Beispiel:
Und Nutzung ist so etwas wie:
quelle
Die Verwendung eines RegEx ist ein einfacher Weg, um dies zu tun:
quelle
Um auf der Antwort hier aufzubauen, können Sie eine String-Erweiterungsmethode erstellen, um dies ein wenig benutzerfreundlicher zu gestalten:
quelle
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
stattdessen, um Probleme beim Erzwingen der Kultur in die USA zu vermeiden .Wenn Sie überprüfen möchten, ob sich Ihre übergebene Zeichenfolge in einer Zeichenfolge befindet, gibt es dafür eine einfache Methode.
Dieser boolesche Wert wird zurückgegeben, wenn die Zeichenfolge enthalten ist oder nicht
quelle
So einfach und funktioniert
quelle
quelle
Sie können die
string.indexof ()
Funktion verwenden. Dies unterscheidet nicht zwischen Groß- und Kleinschreibungquelle
Der Trick hier besteht darin, nach der Zeichenfolge zu suchen und die Groß- und Kleinschreibung zu ignorieren, sie jedoch genau gleich zu halten (mit der gleichen Groß- / Kleinschreibung).
Ausgang ist "Zurücksetzen"
quelle
quelle
Einfacher Weg für Anfänger:
quelle