.net 文字列 部分一致 - C#の大文字と小文字を区別しない演算子がありますか?





6 Answers

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

私は両方のアプローチのパフォーマンスをテストし、順序無視のケースストリングの比較は9倍以上速かった ! また、文字列を大文字または小文字に変換するよりも信頼性が高くなります(トルコ語のiの問題をチェックしてください)。 だから常にString.Equalsメソッドを使って文字列を比較し、

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

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

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

2番目の例では、現在のカルチャの文字列比較ロジックを使用しているため、最初の例の "順序無視ケース"の比較よりも時間がかかります。したがって、カルチャ固有の文字列比較ロジックが不要で、パフォーマンスを最大にした後、「順序無視ケース」の比較を使用します。

詳細については、私のブログの全文を読んでください。

比較 大小 ==

私は、大文字と小文字が区別されることが分かっ

if (StringA == StringB) {

2つの文字列を区別しないで比較する演算子はありますか?




System.Collections.CaseInsensitiveComparer

または

System.StringComparer.OrdinalIgnoreCase



または

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

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

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

ジョンが示唆したように

編集:バグを修正




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

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

私は、文字列がequals演算子で比較される方法が変更されると確信しています。




構文を単純化するためのアイディアです:

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



if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

人々はToUpperInvariant()がToLowerInvariant()よりも速いことを報告します。




Related