不HashSet<string>.Contains()
区分大小写的模式下如何使用方法?
Answers:
您可以HashSet
使用自定义比较器创建:
HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
hs.Add("Hello");
Console.WriteLine(hs.Contains("HeLLo"));
Ordinal
而不是InvariantCulture
。.NET指南建议我们InvariantCulture
在大多数情况下不要使用(请参阅:msdn.microsoft.com/en-us/library/ms973919.aspx)。
正如其他答案所展示的那样,这里没有必要,但是在不使用字符串的其他情况下,您可以选择实现an 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());
您应该使用允许您指定要使用的构造函数IEqualityComparer
。
HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase);
所述StringComparer对象提供了一些经常使用的比较器作为静态属性。
HashSet<string>
(区分大小写)时,不可能创建有效的contains
方法。这是因为将元素的哈希值添加到时会创建它们HashSet
。并且在内部该contains
方法检查散列是否有效。不可能(有效地)将现有的哈希格式“区分大小写”转换为“不区分大小写”。