web-dev-qa-db-ja.com

大文字と小文字を区別しないモードでHashSet <string> .Contains()メソッドを使用するには?

大文字と小文字を区別しないモードでHashSet<string>.Contains()メソッドを使用するには?

67
Tasawer Khan

カスタム比較子を使用してHashSetを作成できます。

HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

hs.Add("Hello");

Console.WriteLine(hs.Contains("HeLLo"));
112
João Angelo

適切なIEqualityComparerで作成する必要があります:

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
10
Kobi

constructor を使用する必要があります。これにより、使用するIEqualityComparerを指定できます。

HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase);

StringComparer オブジェクトは、静的プロパティとしてよく使用される比較子を提供します。

5
Thibault Falise

他の答えが示したように、ここでは必要ありませんが、文字列を使用しない他の場合は、IEqualityComparer<T>を実装することを選択し、.Containsオーバーロードを使用できます。文字列を使用した例を次に示します(再度、他の回答では、ニーズを満たす文字列比較器が既に存在することが示されています)。 IEnumerable<T>を取り巻く多くのメソッドには、そのような比較演算子を受け入れるオーバーロードがあります。そのため、それらの実装方法を学ぶのは良いことです。

class CustomStringComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.Equals(y, StringComparison.InvariantCultureIgnoreCase);
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

そしてそれを使用する

bool contains = hash.Contains("foo", new CustomStringComparer());
5
Anthony Pegram