以下は大文字と小文字が区別されることを知っています。
if (StringA == StringB) {
それで、2つの文字列を区別せずに比較する演算子がありますか?
これを試して:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
文字の大文字小文字を無視して2つの文字列を比較する最良の方法は、序数を指定する静的メソッド String.Equals を使用することです大文字と小文字の比較を無視します。これは最速の方法でもあり、文字列を小文字または大文字に変換してから比較するよりもはるかに高速です。
両方のアプローチのパフォーマンスをテストしましたが、通常の大文字と小文字を区別しない文字列比較は9倍以上高速でした!また、文字列を小文字または大文字に変換するよりも信頼性が高くなります(トルコ語のi問題を確認してください)。そのため、常に String.Equals メソッドを使用して、文字列の同等性を比較します。
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
カルチャ固有の文字列比較を実行する場合は、次のコードを使用できます。
String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
2番目の例では現在のカルチャの文字列比較ロジックを使用しているため、最初の例の「通常の大文字と小文字を区別しない」比較よりも遅くなるため、カルチャ固有の文字列比較ロジックが不要で、最大のパフォーマンスが得られたら、「通常の大文字と小文字を区別しない」比較を使用します。
詳細については、 ブログで記事全体を読んでください 。
StringComparer
静的クラスには、必要に応じて大文字と小文字を区別するタイプの比較子を返すプロパティがいくつかあります。
たとえば、呼び出すことができます
StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
または
StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
StringComparison
引数をとるstring.Equals
またはstring.Compare
オーバーロードよりも少し簡潔です。
System.Collections.CaseInsensitiveComparer
または
System.StringComparer.OrdinalIgnoreCase
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
または
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
ただし、StringAがnullでないことを確認する必要があります。だからおそらくより良いtuの使用:
string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
ジョンが示唆したように
編集:バグを修正
ここで構文を簡素化するアイデア:
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.equals(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
等号演算子による文字列の比較方法が変わると確信しています。
これらの比較メソッドの最後に入力することに慣れています:, 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をチェックする必要があることに注意してください。
string.Compare(string1, string2, true)
他の回答はここでは完全に有効ですが、何らかの形でStringComparison.OrdinalIgnoreCase
を入力し、String.Compare
を使用するのに時間がかかります。
単純な文字列拡張メソッドをコーディングしました。比較では、大文字と小文字を区別するか、ブールで大文字と小文字を区別しないかを指定できます。次の回答を参照してください。
ただやる
if (stringA.toLower() == stringB) {};
次に、stringB.toLower()
を行うために、StringBを小文字として記述します。
.toLower()
は文字列のコピーを小文字で返すため、元の文字列は変更されません。
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
人々は、ToUpperInvariant()がToLowerInvariant()より速いと報告しています。