C#で文字列の比較方法は主に== 演算子、Equalメソッド、Compareメソッドがあります。それぞれ使用用途が異なりますので、用途に応じて使い分けていきましょう。
== (等値)演算子の使用
2つの文字列の内容が等しいかどうかを調べるには、== (等値)演算子を使用します。
以下のようにオブジェクトが異なっていても、中身が同じであれば同一と判断します。
// 変数の設定
string str1 = "sample";
string str2 = "sample";
// 文字列の比較
if (str1 == str2)
{
Console.WriteLine("文字列は同じです。");
}
else
{
Console.WriteLine("文字列は異なります。");
}
■実行結果
文字列は同じです。
また、文字列の小文字・大文字や全角・半角の区別はされますので、以下の場合、文字列は異なります。
// 変数の設定
string str1 = "Sample";
string str2 = "sample";
// 文字列の比較
if (str1 == str2)
{
Console.WriteLine("文字列は同じです。");
}
else
{
Console.WriteLine("文字列は異なります。");
}
■実行結果
文字列は異なります。
Equalメソッドの使用
メソッドの使用用途
等値演算子と同様に値の比較を行うメソッドがEqualメソッドです。
以下のように使用します。
// 変数の設定
string str1 = "sample";
string str2 = "sample";
// 文字列の比較
if (str1.Equals(str2))
Console.WriteLine("文字列は同じです。");
■実行結果
文字列は同じです。
== (等値)演算子との違い
等値演算子と同じように値の比較を行いますが、両者の違いはポリモーフィズム(多様性)です。等値演算子はオーバーロードされますが、Equalメソッドはオーバーライドされることで、比較結果が異なる場合があります。
以下の例を見てみましょう。
// 変数の設定
string str1 = new string(new char[] { 's', 'a', 'm', 'p', 'l', 'e' });
string str2 = new string(new char[] { 's', 'a', 'm', 'p', 'l', 'e' });
// 文字列の比較
Console.WriteLine("== 演算子での比較");
if (((object)str1) == ((object)str2))
{
Console.WriteLine("文字列は同じです。");
}
else
{
Console.WriteLine("文字列は異なります。");
}
Console.WriteLine("");
Console.WriteLine("Equalsメソッドでの比較");
if (((object)str1).Equals(((object)str2)))
{
Console.WriteLine("文字列は同じです。");
}
else
{
Console.WriteLine("文字列は異なります。");
}
■実行結果
== 演算子での比較
文字列は異なります。
Equalsメソッドでの比較
文字列は同じです。
この例では、stringで宣言した変数に対し、object型にアップキャストして比較しています。
== 演算子ではオーバーロードのため、object型同士の比較を行っており、falseで返します。
一方Equalメソッドでは、string型でオーバーライドされたメソッドを使用しているため、trueを返します。
string型で文字列を扱っている場合には問題ありませんが、違いは知っていてもいいですね。
StringComparison列挙体の指定
Equalメソッドでは、StringComparison列挙体の値より、大文字・小文字や並べ替えの規則を指定して比較することができます。
フィールド | 説明 |
---|---|
CurrentCulture | カルチャに依存した並べ替え規則と、現在のカルチャを使用して、文字列を比較します。 |
CurrentCultureIgnoreCase | カルチャに依存した並べ替え規則と、現在のカルチャを使用し、比較対象の文字列の大文字と小文字の区別を無視して、文字列を比較します。 |
InvariantCulture | カルチャに依存した並べ替え規則と、インバリアント カルチャを使用して、文字列を比較します。 |
InvariantCultureIgnoreCase | カルチャに依存した並べ替え規則と、インバリアント カルチャを使用し、比較対象の文字列の大文字と小文字の区別を無視して、文字列を比較します。 |
Ordinal | 序数 (バイナリ) の並べ替え規則を使用して文字列を比較します。 |
OrdinalIgnoreCase | 序数 (バイナリ) の並べ替え規則を使用し、比較対象の文字列の大文字と小文字の区別を無視して、文字列を比較します。 |
string.Compareメソッドの使用
最後にstring.Compareメソッドで文字列の比較を行います。
Compareメソッドでは、文字列の値を比較するのではなく、文字列の並び順を比較しています。以下のように使います。
// 変数の設定
string str1 = "sample";
string str2 = "sample";
// 文字列の比較
if (string.Compare(str1, str2) == 0)
Console.WriteLine("文字列は同じです。");
■実行結果
文字列は同じです。
この例では、戻り値を0で返しています。
Compareメソッドは並び順を比較した結果を-1、0、1で返します。内容は以下の通りです。
string.Compare(A,B);
・AがBよりも順番が前:-1
・AがBの値が同じ:0
・AがBよりも順番が後:1
ちなみにstring.CompareメソッドとString.Compareメソッドがありますが、stringはStringのエイリアスなので、どちらを使用しても大丈夫です。
大文字・小文字を区別しない方法
第3引数にtrueを入れることで大文字と小文字の区別がなく比較することができます。
以下の例で比較結果が同じであることを確認しましょう。
// 変数の設定
string str1 = "sample";
string str2 = "SamPle";
// 文字列の比較
if (string.Compare(str1, str2, true) == 0)
Console.WriteLine("文字列は同じです。");
■実行結果
文字列は同じです。
また、.Net Framework4.0以上を使用すると、trueを名前付き引数で指定することができます。
if (string.Compare(str1, str2, ignoreCase:true) == 0)
このように指定すると、引数の意味が分かりやすく可読性があがりますね。
全角・半角を区別しない方法
全角・半角を区別しない場合は、CultureInfoとCompareOptions.IgnoreWidthを引数に設定します。
以降の例ではSystem.Globalizationの名前空間を宣言しています。
// 変数の設定
string str1 = "sample";
string str2 = "sample";
var cultureInfo = new CultureInfo("ja-JP");
// 文字列の比較
if (string.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth) == 0)
Console.WriteLine("文字列は同じです。");
■実行結果
文字列は同じです。
全角・半角、大文字・小文字を区別しない方法(複数オプション指定)
全角・半角、大文字・小文字を区別しない場合は、CompareOptions.IgnoreWidthとCompareOptions.IgnoreCaseをOR演算子で繋げることで複数の値を設定することができます。
// 変数の設定
string str1 = "sample";
string str2 = "SAMPLE";
var cultureInfo = new CultureInfo("ja-JP");
// 文字列の比較
if (string.Compare(str1, str2, cultureInfo,
CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)
Console.WriteLine("文字列は同じです。");
■実行結果
文字列は同じです。
ちなみにCompareOptions.OrdinalIgnoreCaseも大文字・小文字を区別しませんが、上記のように複数値の設定では使用できませんでした。
他にもひらがなとカタカナを区別しないCompareOptions.IgnoreKanaTypeも存在しますので、以下を参考にしてみてください。
参考:CompareOptions 列挙型
まとめ
今回はC#で文字列の比較方法について、ご紹介いたしました。
文字列の値の比較は==(等値)演算子、Equalメソッドを、並び順はstring.Compareメソッドを使って、試してみてください。