71

如何HashSet<string>.Contains()在不区分大小写模式下使用方法?

4

4 回答 4

122

您可以HashSet使用自定义比较器创建:

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

hs.Add("Hello");

Console.WriteLine(hs.Contains("HeLLo"));
于 2010-04-19T13:19:37.427 回答
10

您需要使用正确的方法创建它IEqualityComparer

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
于 2010-04-19T13:19:21.123 回答
6

正如其他答案所证明的那样,这里没有必要,但是在您不使用字符串的其他情况下,您可以选择实现 anIEqualityComparer<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());
于 2010-04-19T13:21:52.347 回答
5

您应该使用允许您指定要使用的构造函数IEqualityComparer

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

StringComparer对象提供了一些常用的比较器作为静态属性。

于 2010-04-19T13:20:31.123 回答