2010-06-25 7 views
151

Wie kann ich die Zeile unter Groß-und Kleinschreibung nicht beachten?Wie kann ich einen Vergleich zwischen Groß- und Kleinschreibung vornehmen?

drUser["Enrolled"] = 
     (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1); 

ich einige Ratschläge früher gegeben wurde heute bekannt, dass vorgeschlagen, dass ich verwenden:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase))); 

das Problem ist, kann ich nicht an die Arbeit, ich die Zeile unter versucht haben, kompiliert diese aber zurückkehrt Wenn die falschen Ergebnisse zurückgegeben werden, werden angemeldete Benutzer als nicht registrierte und nicht registrierte Benutzer als registrierte Benutzer zurückgegeben.

drUser["Enrolled"] = 
     (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], 
           StringComparison.OrdinalIgnoreCase))); 

Kann jemand auf das Problem hinweisen?

+1

Welchen Datentyp sollte 'drUser [" Enrolled "] sein? Es sieht wie ein boolescher Wert aus, aber 'FindIndex()' gibt den Index zurück. Wenn der Index dieses Benutzers 0 ist, wird 0 zurückgegeben, was möglicherweise falsch ist. Wann ist es in Wirklichkeit wahr? Die 'Exists()' Methode könnte in diesem Fall besser sein. – drharris

+0

Sind Sie sicher, dass es keine Zeit für die Formatierung oder einen zusätzlichen Platz in einem Feld gibt, das nicht in dem anderen liegt? – joshlrogers

+1

Ich würde vorschlagen, insertedUsers.Any() anstelle von FindIndex (und Test) zu verwenden. – Marc

Antwort

1

Wie wäre es mit StringComparison.CurrentCultureIgnoreCase stattdessen?

+4

-1: Diese Antwort ist nicht ausreichend. Bitte beachten Sie die Antwort von @ ocean4dream: http://stackoverflow.com/a/13965429/109941. –

+0

@decyclone: ​​Es ist langsamer als OrdinalIgnoreCase, aber vielleicht in einigen Fällen relevant. Deshalb gebe ich nicht -1. https://stackoverflow.com/questions/2749662/string-comparison-invariantculturureigorecase-vs-ordinalignorecase –

+0

Auch https://stackoverflow.com/questions/72696/which-isgenerally-best-to-use-stringcomparison-ordinalignorecase -oder-stringco –

32

sollten Sie statisch verwenden String.Compare Funktion wie folgt

x => String.Compare (x.Username, (string)drUser["Username"], 
        StringComparison.OrdinalIgnoreCase) == 0 
+2

Nein, Sie sollten 'String.Equals' anstelle von' String.Compare' verwenden. Es gibt keine Notwendigkeit zu berechnen, welches größer ist, nur dass sie nicht gleich sind. – ErikE

+0

@ErikE: Ich frage mich, welche Methode du in 6 Jahren empfehlen wirst :-) – Oleg

+0

Ich wundere mich nicht! Ich bin zuversichtlich, dass ich die Verwendung der Gleichheit empfehlen werde, wenn Sie Gleichheits-Semantik wollen, und die Verwendung von Vergleichen, wenn Sie eine Vergleichssemantik wünschen. Was ist daran so schwer? 'IEquatable' und' IComparable' machen NICHT dasselbe, und Sie können Klassen haben, die eine implementieren, in der es aber keinen Sinn macht, die andere zu implementieren. Zum Beispiel könnten Sie Sensorproben nach der Zeit bestellen, ohne dass diese gleich sind (IComparable). Und, Sie können angeben, ob die Dinge gleich sind (IEquatable), aber es macht keinen Sinn, sie zu bestellen (sagen wir, Computer-Seriennummern). – ErikE

297

Dies ist nicht die beste Praxis in .NET-Framework (4 & +) Gleichheit

String.Compare(x.Username, (string)drUser["Username"], 
        StringComparison.OrdinalIgnoreCase) == 0 

Verwenden Sie den folgenden anstelle

überprüfen
String.Equals(x.Username, (string)drUser["Username"], 
        StringComparison.OrdinalIgnoreCase) 

MSDN recommends:

  • eine Überlastung des String.Equals Methode können testen, ob zwei Zeichenketten gleich sind.
  • Verwenden Sie die String.Compare und String.CompareTo Methoden Strings nicht zu sortieren, für Gleichheit zu überprüfen.
+5

Sie sollten 'string.Compare', nicht' String.Compare' verwenden. – Fred

+2

@Fred Ich stimme zu, aber können Sie den Grund dafür qualifizieren? – Gusdor

+0

@Gusdor siehe http://stackoverflow.com/questions/32187486/why-is-string-constireds-a-simplified-version-of-string und https://stackoverflow.com/questions/7074/in-c- sharp-whats-the-difference-zwischen-string-und-string – Fred

-9

Sie können immer Funktionen nutzen: .ToLower(); . ToUpper();

konvertieren Sie Ihre Saiten und dann vergleichen ...

Good Luck

+0

Ich denke nicht, dass dies sein Problem lösen würde. Markieren Sie auch, dass diese Frage bereits mehr als 4 Jahre alt ist. –

+4

Dies erzeugt eine neue Zeichenfolge, ich halte dies für sehr ineffizient. Da zum Erstellen dieser neuen Zeichenfolge alle Zeichen überprüft und in den gewünschten Fall konvertiert werden, muss der Vergleich alle Zeichen erneut überprüfen. Es verbraucht also mehr Speicher und Rechenleistung. – Air2

+2

Dies ist wegen der Speicherzuweisung sehr schlecht. –

13

Bitte dies zum Vergleich verwenden:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+2

Seien Sie sich der Vorteile und Nachteile von CurrentCultureIgnoreCase vs. OrdinalIgnoreCase bewusst. Wenn Sie die Semantik des Kulturvergleichs nicht benötigen, sparen Sie etwas Leistung und verwenden Sie den ordinalen Vergleich. – ErikE

2

Ich glaube, Sie weitere Informationen unter diesem Link finden:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

Verwendung th e Vergleichen Sie die statische Methode für die String-Klasse, um die beiden Strings zu vergleichen. Ob der Vergleich die Groß-/Kleinschreibung nicht berücksichtigt, wird durch den dritten Parameter einer seiner Überladungen bestimmt. Zum Beispiel:

string lowerCase = "abc"; 
string upperCase = "AbC"; 
int caseInsensitiveResult = string.Compare(lowerCase, upperCase, 
    StringComparison.CurrentCultureIgnoreCase); 
int caseSensitiveResult = string.Compare(lowerCase, 
    StringComparison.CurrentCulture); 

Der caseSensitiveResult Wert -1 ist (was anzeigt, dass Kleinbuchstaben „kleiner als“ Großschreibung) und die caseInsensitiveResult null (was anzeigt, dass Kleinbuchstaben „gleich“ Großschreibung).

2

können Sie (wenn auch kontroverse) erweitern System.String einen Fall unempfindlich Vergleich zu bieten: public static bool CIEquals(this String a, String b) { return a.Equals(b, StringComparison.CurrentCultureIgnoreCase); } und verwenden als solche:

x.Username.CIEquals((string)drUser["Username"]);

C# Sie Dutzende von Tausenden Erweiterungsmethoden erstellen können, die können dienen als Syntax-Suggars in Ihrem Projekt, ziemlich nützlich, würde ich sagen.

Es ist nicht die Antwort und ich weiß, dass diese Frage alt und gelöst ist, wollte ich nur diese Bits hinzufügen.

0

Andere Antworten sind hier absolut gültig, aber irgendwie dauert es einige Zeit, um StringComparison.OrdinalIgnoreCase und auch String.Compare einzugeben.

Ich habe einfache String-Extension-Methode codiert, in dem Sie festlegen können, wenn Vergleich Groß- und Kleinschreibung oder Fall sinnlos mit boolean ist, hier ganze Code-Schnipsel Befestigung:

using System; 

/// <summary> 
/// String helpers. 
/// </summary> 
public static class StringExtensions 
{ 
    /// <summary> 
    /// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a') 
    /// </summary> 
    public static bool CompareTo(this string strA, string strB, bool ignoreCase) 
    { 
     return String.Compare(strA, strB, ignoreCase) == 0; 
    } 
} 

Danach ganze Vergleich von 10 Zeichen verkürzt ca. - vergleichen:

Vor der Verwendung von String-Erweiterung:

String.Compare(testFilename, testToStart,true) != 0 

Nach der Verwendung von String-Erweiterung:

testFilename.CompareTo(testToStart, true) 
Verwandte Themen