使HashSet< string>不区分大小写 [英] Make HashSet<string> case-insensitive

查看:528
本文介绍了使HashSet< string>不区分大小写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有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&lt; string&gt;不区分大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆