web-dev-qa-db-ja.com

大文字と小文字を区別しない文字列比較を行うにはどうすればよいですか?

下の行の大文字と小文字を区別しないようにするにはどうすればよいですか?

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

私は今日私が使用することを示唆したいくつかのアドバイスを与えられました:

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

問題は、これを動作させることができず、下の行を試したが、これはコンパイルされますが、間違った結果を返します。

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

誰でも問題を指摘できますか?

197
Jamie

これは、等価性をチェックするための.NETフレームワーク(4&+)のベストプラクティスではありません。

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

代わりに次を使用してください

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

MSDN推奨:

  • String.Equalsメソッドのオーバーロードを使用して、2つの文字列が等しいかどうかをテストします。
  • String.CompareおよびString.CompareToメソッドを使用して文字列を並べ替え、 同等性をチェックしない
367
ocean4dream

次のような静的String.Compare関数を使用する必要があります

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

比較のためにこれを使用してください:

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

他の回答はここでは完全に有効ですが、何らかの理由でStringComparison.OrdinalIgnoreCaseを入力し、String.Compareを使用するのに時間がかかります。

単純な文字列拡張メソッドをコーディングしました。比較では、大文字と小文字を区別するか、ブールを使用して大文字と小文字を区別しないかを指定できます。ここにコードスニペット全体を添付します。

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;
    }
}

比較全体が約10文字短くなった後-比較:

文字列拡張機能を使用する前に:

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

文字列拡張機能を使用した後:

testFilename.CompareTo(testToStart, true)
6
TarmoPikaro

(論争はあるものの)System.Stringを拡張して、大文字と小文字を区別しない比較拡張メソッドを提供できます。

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

そしてそのように使用します:

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

C#を使用すると、プロジェクトで構文サグガーとして機能する拡張メソッドを作成できます。これは非常に便利です。

それは答えではなく、この質問は古くて解決されていることを知っています。これらのビットを追加したかっただけです。

4
Felype

このリンクでより多くの情報を見つけると思います:

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

StringクラスのCompare静的メソッドを使用して、2つの文字列を比較します。比較で大文字と小文字が区別されるかどうかは、そのオーバーロードのいずれかの3番目のパラメーターによって決まります。例えば:

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

CaseSensitiveResultの値は-1(lowerCaseがupperCaseより小さいことを示す)およびcaseInsensitiveResultはゼロ(lowerCaseがupperCaseに等しいことを示す)です。

3
i_th

代わりにStringComparison.CurrentCultureIgnoreCaseを使用してはどうですか?

1
decyclone