wake-up-neo.com

Wie kann ich einen String-Vergleich durchführen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird?

Wie kann ich die Zeile unter Groß-/Kleinschreibung unberücksichtigt lassen?

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

Ich habe heute einen Rat erhalten, der vorschlug, dass ich Folgendes verwende:

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

das Problem ist, dass ich dies nicht zum Laufen bringen kann. Ich habe die folgende Zeile ausprobiert. Diese wird kompiliert, gibt jedoch die falschen Ergebnisse zurück. Sie gibt registrierte Benutzer als nicht registrierte und nicht registrierte Benutzer als registrierte Benutzer zurück.

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

Kann jemand auf das Problem hinweisen?

199
Jamie

Dies ist nicht die bewährte Methode in .NET Framework (4 & +), um die Gleichheit zu überprüfen

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

Verwenden Sie stattdessen Folgendes

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

MSDN empfiehlt:

  • Verwenden Sie eine Überladung der String.Equals-Methode, um zu testen, ob zwei Zeichenfolgen gleich sind.
  • Verwenden Sie die Methoden String.Compare und String.CompareTo , um Zeichenfolgen zu sortieren. nicht auf Gleichheit prüfen .
373
ocean4dream

Sie sollten statische String.Compare funktioniert wie folgt

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

Bitte benutzen Sie dies zum Vergleich:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
20

Andere Antworten sind hier völlig gültig, aber irgendwie dauert es einige Zeit, StringComparison.OrdinalIgnoreCase Einzugeben und auch String.Compare Zu verwenden.

Ich habe eine einfache String-Erweiterungsmethode codiert, bei der Sie angeben können, ob bei einem Vergleich zwischen Groß- und Kleinschreibung unterschieden oder zwischen Klein- und Kleinschreibung unterschieden werden soll.

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 verkürzt sich der gesamte Vergleich um ungefähr 10 Zeichen - vergleichen Sie:

Vor der Verwendung der Zeichenfolgenerweiterung:

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

Nach der Verwendung der String-Erweiterung:

testFilename.CompareTo(testToStart, true)
7
TarmoPikaro

Sie können System.String (Obwohl kontrovers) erweitern, um eine Methode zur Erweiterung des Vergleichs ohne Berücksichtigung der Groß- und Kleinschreibung bereitzustellen:

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}

und als solche verwenden:

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

Mit C # können Sie Erweiterungsmethoden erstellen, die in Ihrem Projekt als Syntaxzucker dienen können.

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

4
Felype

Ich denke, Sie finden weitere Informationen in diesem Link:

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

Verwenden Sie die statische Compare-Methode für die String-Klasse, um die beiden Strings zu vergleichen. Ob beim Vergleich die Groß- und Kleinschreibung nicht beachtet wird, 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 ist -1 (was angibt, dass lowerCase "kleiner als" upperCase ist) und der caseInsensitiveResult ist Null (was angibt, dass lowerCase "gleich" upperCase ist).

3
i_th

Wie wäre es mit StringComparison.CurrentCultureIgnoreCase stattdessen?

1
decyclone