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


70

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


5
一个边节点:创建“正常” HashSet<string>(区分大小写)时,不可能创建有效的contains方法。这是因为将元素的哈希值添加到时会创建它们HashSet。并且在内部该contains方法检查散列是否有效。不可能(有效地)将现有的哈希格式“区分大小写”转换为“不区分大小写”。
朱利安

Answers:


121

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

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

hs.Add("Hello");

Console.WriteLine(hs.Contains("HeLLo"));

15
+1,因为您使用Ordinal而不是InvariantCulture。.NET指南建议我们InvariantCulture在大多数情况下不要使用(请参阅:msdn.microsoft.com/en-us/library/ms973919.aspx)。
史蒂文

1
通常,CurrentCultureIgnoreCase是更好的选择。
汉斯·帕桑特

1
mdsdn说:使用StringComparison.Ordinal或OrdinalIgnoreCase进行比较,作为与文化无关的字符串匹配的安全默认值。
阿米特(Amit)2014年

2
我相信CurrentCultureIgnoreCase将无法通过“土耳其测试”。如果当前的文化是土耳其,则“ LIST”和“ list”将不匹配,因为该文化中“ I”的小写字母不是“ i”,而是带点的“ı”。因此,如果您期望“ LIST” ==“ list”,您会失望的是,如果当前的文化是土耳其,那么它将返回false。如果您要比较的字符串不是用户语言中的字符串,即,如果它们是某种与用户语言无关的字符串,请使用InvariantCultureIgnoreCase
AaronLS 2014年

1
无法编辑,但确实如此,与InvariantCultureIgnoreCase相比,通常首选OrdinalIgnoreCase。我只是想指出为什么CurrentCultureIgnoreCase可能不适用(但取决于它是否是与用户语言相关的字符串)。
AaronLS 2014年

10

您需要使用以下权限创建它IEqualityComparer

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

6

正如其他答案所展示的那样,这里没有必要,但是在不使用字符串的其他情况下,您可以选择实现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());

5

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.