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

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

Ответы [ 4 ]

111 голосов
/ 19 апреля 2010

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

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

hs.Add("Hello");

Console.WriteLine(hs.Contains("HeLLo"));
10 голосов
/ 19 апреля 2010

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

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
5 голосов
/ 19 апреля 2010

Здесь нет необходимости, как показали другие ответы, но в других случаях, когда вы не используете строку, вы можете выбрать реализацию 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 голосов
/ 19 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...