我有一个带有HashSet参数的方法.我需要在其中进行不区分大小写的包含:

public void DoSomething(HashSet<string> set, string item)
{
    var x = set.Contains(item);
    ... 
}

有没有办法使现有的HashSet不区分大小写(不创建新的HashSet)?

我在寻找性能最好的解决方案.

Edit

可以多次调用Contains.所以IEnumerable扩展对我来说是不可接受的,因为它的性能低于原生HashSet包含的方法.

Solution

因为,我的问题的答案是否定的,这是不可能的,所以我创建并使用了以下方法:

public HashSet<string> EnsureCaseInsensitive(HashSet<string> set)
{
    return set.Comparer == StringComparer.OrdinalIgnoreCase
           ? set
           : new HashSet<string>(set, StringComparer.OrdinalIgnoreCase);
}

推荐答案

HashSet<T>构造函数有一个重载,允许您传入自定义IEqualityComparer<string>.静态StringComparer类中已经为您定义了其中一些,其中一些忽略大小写.例如:

var set = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
set.Add("john");
Debug.Assert(set.Contains("JohN"));

你必须在建造HashSet<T>的时候做这个改变.一旦存在,您就不能更改它正在使用的IEqualityComparer<T>.


正如您所知,默认情况下(如果您没有将任何IEqualityComparer<T>传递给HashSet<T>构造函数),它将使用EqualityComparer<T>.Default.


Edit

在我发布我的答案后,这个问题似乎发生了变化.如果您必须在现有 case sensitive HashSet<string>中执行 case insensitive搜索,则必须执行线性搜索:

set.Any(s => string.Equals(s, item, StringComparison.OrdinalIgnoreCase));

这是没办法的.

.net相关问答推荐

仅使用 .NET GetBytes 方法转换有效字节而不创建问号

在 Rx 中,处理线程安全是否是消费者(IObserver)的责任?

MassTransit RespondAsync 无法返回空值

如何在选项卡中 Select Winforms NumericUpDown 中的所有文本?

将字符串与容差进行比较

在 ASP.NET MVC 中我可以在哪里放置自定义类?

如何在 C# 4.0 中使任务进入睡眠状态(或延迟)?

哪个单元测试框架?

LINQ 性能常见问题解答

获取 .NET Framework 目录路径

InternalsVisibleTo 属性不起作用

在 .NET Core RC2 中构建 .exe 文件

List 和 IEnumerable 的实际区别

X509Certificate 构造函数异常

将日期时间转换为时间跨度

使 HashSet 不区分大小写

如何从文件中删除单个属性(例如只读)?

DateTime.Compare 如何判断日期是否小于 30 天?

.NET 的 XPath 和 XSLT 2.0?

任何人都知道缺少枚举通用约束的好方法吗?