使HashSet< string>不区分大小写 [英] Make HashSet<string> case-insensitive
问题描述
我有带有HashSet参数的方法。我需要在其中包含不区分大小写的内容:
I have method with HashSet parameter. And I need to do case-insensitive Contains within it:
public void DoSomething(HashSet<string> set, string item)
{
var x = set.Contains(item);
...
}
有没有办法使现有的HashSet成为例-不敏感(不要创建新的)?
Is it any way to make existing HashSet case-insensitive (do not create new one)?
我正在寻找性能最佳的解决方案。
I'm looking for solution with best perfomance.
编辑
可以多次调用包含的内容。所以IEnumerable扩展对我来说是不可接受的,因为它的性能比本地的HashSet Contains方法要低。
Contains can be called multiple times. So IEnumerable extensions are not acceptable for me due to lower perfomance than native HashSet Contains method.
解决方案
因为,对我的问题的回答是否,这是不可能的,我创建并使用了以下方法:
Since, answer to my question is NO, it is impossible, I've created and used following method:
public HashSet<string> EnsureCaseInsensitive(HashSet<string> set)
{
return set.Comparer == StringComparer.OrdinalIgnoreCase
? set
: new HashSet<string>(set, StringComparer.OrdinalIgnoreCase);
}
推荐答案
HashSet< T>
构造函数有一个重载,可让您传入自定义的 IEqualityComparer< string>
。在静态 StringComparer
类中已经为您定义了其中一些,其中一些忽略大小写。例如:
The HashSet<T>
constructor has an overload that lets you pass in a custom IEqualityComparer<string>
. There are a few of these defined for you already in the static StringComparer
class, a few of which ignore case. For example:
var set = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
set.Add("john");
Debug.Assert(set.Contains("JohN"));
在构造 HashSet<时必须进行此更改; T>
。一旦存在,就无法更改它正在使用的 IEqualityComparer< T>
。
You'll have to make this change at the time of constructing the HashSet<T>
. Once one exists, you can't change the IEqualityComparer<T>
it's using.
请注意,默认情况下(如果您不将任何 IEqualityComparer< T>
传递给 HashSet< T> ;
构造函数),它使用 EqualityComparer< T>。默认
。
Just so you know, by default (if you don't pass in any IEqualityComparer<T>
to the HashSet<T>
constructor), it uses EqualityComparer<T>.Default
instead.
问题在我发布答案后似乎已经改变。如果您必须在不区分大小写的现有商品 HashSet< string>
中进行不区分大小写的查询,则必须进行线性搜索:
The question appears to have changed after I posted my answer. If you have to do a case insensitive search in an existing case sensitive HashSet<string>
, you will have to do a linear search:
set.Any(s => string.Equals(s, item, StringComparison.OrdinalIgnoreCase));
无法解决这个问题。
这篇关于使HashSet< string>不区分大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!