4.7以前の.NET FrameworkでCompareOptionsを使用してDictionaryを作成する場合は、CompareInfo.CompareメソッドをラップしてIEqualityComparer<string>を実装するクラスを独自に実装する必要があります。
CompareOptionsを使用してキーのひらがなとカタカナの違い無視するDictionaryを作成する(.NET Framework 4.7以前)
using System;
using System.Collections.Generic;
using System.Globalization;
// ひらがな・カタカナの違いを無視するIEqualityComparer<string>
class IgnoreKanaTypeComparer : EqualityComparer<string> {
public override bool Equals(string x, string y)
{
// CompareOptions.IgnoreKanaTypeを指定して2つの文字列が等しいか否かを判定する
return String.Compare(x, y, CultureInfo.InvariantCulture, CompareOptions.IgnoreKanaType) == 0;
}
public override int GetHashCode(string s)
{
// 実装は省略
return 0;
}
}
class Sample {
static void Main()
{
// 独自に実装したIEqualityComparer<string>を指定してDictionaryを作成する
var dict = new Dictionary<string, string>(new IgnoreKanaTypeComparer());
dict["ほげ"] = "hoge";
dict["ぴよ"] = "piyo";
dict["ふが"] = "fuga";
dict["ピヨ"] = "PIYO"; // ひらがな・カタカナの違いは無視されるため、キー"ぴよ"の値が上書きされる
foreach (var p in dict) {
Console.WriteLine("{0} => {1}", p.Key, p.Value);
}
Console.WriteLine(dict.ContainsKey("ピヨ"));
}
}
実行結果
ほげ => hoge ぴよ => PIYO ふが => fuga True
この例では、EqualityComparer<string>クラスを継承することでIEqualityComparer<string>インターフェイスを実装しています。 また、GetHashCodeメソッドの実装は省略していますが、オブジェクトのハッシュ値が使用される場合は適切に実装する必要があります。
EqualityComparer<T>についての解説や実装例については等価性の定義と比較 §.EqualityComparer<T>を参照してください。