web-dev-qa-db-ja.com

C#の大文字と小文字を区別しない等号演算子はありますか?

以下は大文字と小文字が区別されることを知っています。

if (StringA == StringB) {

それで、2つの文字列を区別せずに比較する演算子がありますか?

146
GateKiller

これを試して:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
278
John Feminella

文字の大文字小文字を無視して2つの文字列を比較する最良の方法は、序数を指定する静的メソッド String.Equals を使用することです大文字と小文字の比較を無視します。これは最速の方法でもあり、文字列を小文字または大文字に変換してから比較するよりもはるかに高速です。

両方のアプローチのパフォーマンスをテストしましたが、通常の大文字と小文字を区別しない文字列比較は9倍以上高速でした!また、文字列を小文字または大文字に変換するよりも信頼性が高くなります(トルコ語のi問題を確認してください)。そのため、常に String.Equals メソッドを使用して、文字列の同等性を比較します。

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);

カルチャ固有の文字列比較を実行する場合は、次のコードを使用できます。

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);

2番目の例では現在のカルチャの文字列比較ロジックを使用しているため、最初の例の「通常の大文字と小文字を区別しない」比較よりも遅くなるため、カルチャ固有の文字列比較ロジックが不要で、最大のパフォーマンスが得られたら、「通常の大文字と小文字を区別しない」比較を使用します。

詳細については、 ブログで記事全体を読んでください

28
Pavel Vladov

StringComparer静的クラスには、必要に応じて大文字と小文字を区別するタイプの比較子を返すプロパティがいくつかあります。

StringComparerプロパティ

たとえば、呼び出すことができます

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

または

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

StringComparison 引数をとるstring.Equalsまたはstring.Compareオーバーロードよりも少し簡潔です。

18
Ryan Lundy
System.Collections.CaseInsensitiveComparer

または

System.StringComparer.OrdinalIgnoreCase
15
leppie
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
9
Erick

または

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {

ただし、StringAがnullでないことを確認する必要があります。だからおそらくより良いtuの使用:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);

ジョンが示唆したように

編集:バグを修正

7
Grzenio

ここで構文を簡素化するアイデア:

public class IgnoreCase
{
    private readonly string _value;

    public IgnoreCase(string s)
    {
        _value = s;
    }

    protected bool Equals(IgnoreCase other)
    {
        return this == other;
    }

    public override bool Equals(object obj)
    {
        return obj != null &&
               (ReferenceEquals(this, obj) || (obj.GetType() == GetType() && this == (IgnoreCase) obj));
    }

    public override int GetHashCode()
    {
        return _value?.GetHashCode() ?? 0;
    }

    public static bool operator ==(IgnoreCase a, IgnoreCase b)
    {
        return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
    }

    public static bool operator !=(IgnoreCase a, IgnoreCase b)
    {
        return !(a == b);
    }

    public static implicit operator string(IgnoreCase s)
    {
        return s._value;
    }

    public static implicit operator IgnoreCase(string s)
    {
        return new IgnoreCase(s);
    }
}

次のように使用可能:

Console.WriteLine((IgnoreCase) "a" == "b"); // false
Console.WriteLine((IgnoreCase) "abc" == "abC"); // true
Console.WriteLine((IgnoreCase) "Abc" == "aBc"); // true
Console.WriteLine((IgnoreCase) "ABC" == "ABC"); // true
4
renouve

使用できます

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
4
Andy Mikula

オペレーター?いいえ。ただし、文字列の比較で大文字と小文字を区別しないように、文化を変更できると思います。

// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo

等号演算子による文字列の比較方法が変わると確信しています。

3
John Leidegren

これらの比較メソッドの最後に入力することに慣れています:, StringComparison.

だから私は拡張を行いました。

namespace System
{   public static class StringExtension
    {
        public static bool Equals(this string thisString, string compareString,
             StringComparison stringComparison)
        {
            return string.Equals(thisString, compareString, stringComparison);
        }
    }
}

Extを呼び出す前に、thisStringでnullをチェックする必要があることに注意してください。

2
Valamas
string.Compare(string1, string2, true)
0
user25623

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

単純な文字列拡張メソッドをコーディングしました。比較では、大文字と小文字を区別するか、ブールで大文字と小文字を区別しないかを指定できます。次の回答を参照してください。

https://stackoverflow.com/a/49208128/2338477

0
TarmoPikaro

ただやる

if (stringA.toLower() == stringB) {};

次に、stringB.toLower()を行うために、StringBを小文字として記述します。

.toLower()は文字列のコピーを小文字で返すため、元の文字列は変更されません。

0
Ben Rauzi
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

人々は、ToUpperInvariant()がToLowerInvariant()より速いと報告しています。

0
knoopx