Как использовать HashSet.Содержит () метод в режиме без учета регистра?


Как использовать HashSet<string>.Contains() метод в режиме без учета регистра?

4 62

4 ответа:

Вы можете создать HashSet с пользовательским компаратор:

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

hs.Add("Hello");

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

вам нужно создать его с правом IEqualityComparer:

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

вы должны использовать конструктор что позволяет вам указать IEqualityComparer вы хотите использовать.

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

The StringComparer объект предоставляет некоторые часто используемые компараторы в качестве статических свойств.

это не обязательно здесь, как показали другие ответы, но в других случаях, когда вы не используете строку, вы можете реализовать 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());