いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

ひらがなとカタカナの違いを無視して文字列比較 (string.Compare, CultureInfo, CompareInfo, CompareOptions, IgnoreKanaType)


知ってると、ちょっと便利かもしれないTips。メモメモ。


System.Stringには、静的なCompareメソッドが存在しますが
このメソッドには、いくつかのオーバーロードが存在します。


そのうちの一つに、CultureInfoとCompareOptionsを引数にとるオーバーロード
があり、指定するCompareOptionsの値によって、いろいろな比較方法を指定できます。


で、このCompareOptionsには

CompareOptions.IgnoreKanaType

という値があり、これを指定すると

ひらがなとカタカナの違いを無視して文字列比較

が行われます。


以下、サンプルです。

  using System.Globalization;

  #region CompareOptionsSamples-01
  /// <summary>
  /// 比較メソッドの結果値を変換するためのヘルパークラス.
  /// </summary>
  public static class CompareResultHelper
  {
    static readonly string[] CompResults = { "小さい", "等しい", "大きい" };
    
    // 比較結果の数値を文字列に変換.
    public static string ToStringResult(this int self)
    {
      return CompResults[self + 1];
    }
  }
  
  /// <summary>
  /// CompareOptions列挙型のサンプルです。
  /// </summary>
  public class CompareOptionsSamples01 : IExecutable
  {
    public void Execute()
    {
      //
      // string.Compareメソッドには、CultureInfoとCompareOptionsを
      // 引数にとるオーバーロードが定義されている。(他にもオーバーロードメソッドが存在します。)
      //
      // このオーバーロードを利用する際、CompareOptions.IgnoreKanaTypeを指定すると
      // 「ひらがな」と「カタカナ」の違いを無視して、文字列比較を行う事が出来る。
      //
      string ja1 = "はろーわーるど";
      string ja2 = "ハローワールド";
      
      CultureInfo ci = new CultureInfo("ja-JP");
      
      // 標準の比較方法で比較
      Console.WriteLine("{0}", string.Compare(ja1, ja2, ci, CompareOptions.None).ToStringResult());
      // 大文字小文字を無視して比較.
      Console.WriteLine("{0}", string.Compare(ja1, ja2, ci, CompareOptions.IgnoreCase).ToStringResult());
      // ひらがなとカタカナの違いを無視して比較
      // つまり、「はろーわーるど」と「ハローワールド」を同じ文字列として比較
      Console.WriteLine("{0}", string.Compare(ja1, ja2, ci, CompareOptions.IgnoreKanaType).ToStringResult());
      
      //
      // string.Compareメソッドは、内部でCutureInfoから、そのカルチャーに紐づく
      // CompareInfoを取り出して、比較処理を行っているので、自前で直接CompareInfoを
      // 用意して、Compareメソッドを呼び出しても同じ結果となる。
      //
      CompareInfo compInfo = CompareInfo.GetCompareInfo("ja-JP");
      Console.WriteLine("{0}", compInfo.Compare(ja1, ja2, CompareOptions.IgnoreKanaType).ToStringResult());
    }
  }
  #endregion

上記のサンプルでは、「はろーわーるど」と「ハローワールド」の2つの文字列をstring.Compareメソッドで比較しています。


結果は、以下のようになります。

  大きい
  大きい
  等しい
  等しい

IgnoreKanaTypeを指定した場合、同じ文字列として判定されています。



================================
過去の記事については、以下のページからご参照下さい。