使HashSet< string>不区分大小写

编程入门 行业动态 更新时间:2024-10-11 19:15:24
本文介绍了使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;不区分大小写

本文发布于:2023-11-03 21:24:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1556121.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:大小写   amp   HashSet   lt   gt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!