Как использовать метод HashSet<string>.Contains()
в режиме без учета регистра?
Как использовать метод HashSet‹string›.Contains() в режиме без учета регистра?
Ответы (4)
Вы можете создать 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).
- person Steven; 19.04.2010
Вам нужно создать его с правами IEqualityComparer
:
HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
Здесь нет необходимости, как показали другие ответы, но в других случаях, когда вы не используете строку, вы можете реализовать 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
проверяет эффективность хэшей. Невозможно (эффективно) преобразовать существующую форму хэша «с учетом регистра» в «без учета регистра». - person Julian   schedule 24.03.2011