C# 需要:.Net集合,该集合快速高效地存储大量不区分大小写的字符串

C# 需要:.Net集合,该集合快速高效地存储大量不区分大小写的字符串,c#,.net,collections,generics,C#,.net,Collections,Generics,我正在寻找一个简单的集合,它将以不区分大小写的方式存储一组字符串。我至少需要一个Contains()和Remove()方法来查看是否存在某个字符串并删除该字符串 我尝试了列表,但那是区分大小写的。我需要一个不区分大小写的字典,但这“感觉”像是在浪费空间。对每个字符串执行ToLower(),会浪费性能 有人知道我应该使用哪种.Net集合吗?您可以使用。您应该使用新的哈希集(StringComparer.OrdinalingOreCase) 请注意,这是一个无序集。编写您自己的Contains()和

我正在寻找一个简单的集合,它将以不区分大小写的方式存储一组字符串。我至少需要一个
Contains()
Remove()
方法来查看是否存在某个字符串并删除该字符串

我尝试了
列表
,但那是区分大小写的。我需要一个不区分大小写的
字典
,但这“感觉”像是在浪费空间。对每个字符串执行
ToLower()
,会浪费性能


有人知道我应该使用哪种.Net集合吗?

您可以使用。

您应该使用
新的哈希集(StringComparer.OrdinalingOreCase)


请注意,这是一个无序集。

编写您自己的
Contains()
Remove()
方法,这些方法执行不区分大小写的比较。

今天也有同样的问题要解决。如果可以包含Linq,那么列表将使用比较器重载方法

using System.Linq;

List<string> stringList = new List<string>();
stringList.Contains("hello", StringComparer.OrdinalIgnoreCase);
使用System.Linq;
List stringList=新列表();
Contains(“hello”,StringComparer.OrdinalIgnoreCase);
希望这有助于:
Martin

默认情况下,字典不区分大小写。但是,您可以实现自己的变体,以使其更敏感。(这一点我可能错了:D)

我对Dictionary也有同样的问题,但在尝试了很多IEquality实现之后,我最终与LINQ达成了一致

string k = customers.Where(c => c.Key.Equals(valueToSearch, StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Key;

if (!string.IsNullOrEmpty(k) && k.ToUpper() == valueToSearch.ToUpper())
{
    // Do some thing
}
希望这能对将来的人有所帮助



Sanjay Zalke

无序集合的性能含义是什么。有没有订购的版本?由于要求更宽松,无序的集合总是比订购的集合更快。文档中说包含和删除是一个O(1)操作+1.请注意,Dictionary还提供了相同的构造函数“PublicDictionary(IEqualityComparer comparer comparer)”,具有类似的性能-如果需要将数据与字符串关联,可以切换到它。在放置任何一个之前,都不需要执行ToUpperInvariant(从不使用ToLower)。您有.Net 2.0替代方案吗?当然,我猜如果你没有键入与插入文本不同的文本,可能不合适。我们仍然存在内存中双值的问题。@SLaks:希望我能将所有可用的up投票用于你的评论;希望它听起来也很机智……当你说“一串”时,我们谈论了多少?你可以像以前那样使用一个列表,并在StringComparer.OrdinalIgnoreCase中通过SLaks在调用包含+/-10K项时所说的,并且我需要非常频繁地测试这个集合。考虑存储小写字符串,而不是进行不区分大小写的比较。这可能会更快。您的解决方案如何比建议的哈希集更快?框架中已经存在使用比较器的扩展方法。哈希集将比任何其他选项快得多。我想我错过了OPs关于速度的问题的要点。我必须在您发布解决方案的同时发布我的解决方案。我想我会用“它不会更快”来结束评论。不幸的是,LINQ是3.5,我正在为2.0开发。您的解决方案的问题是,contains将采用O(N),而我缺少一个remove函数。看起来哈希集将提供最好的性能。感谢您的评论。字典的问题是您有一个键/值对。我只需要知道字符串是否存在。不需要“值”部分。所以使用字典会浪费内存空间。嗨,Kees,这个实现完全不只是和字典相关,而是LINQ,所以它适用于.net中的所有对象,包括数据库。如果您有列表,请使用:[code](字符串k=customers.Where(c=>c.Equals(valueToSearch,StringComparison.OrdinalIgnoreCase)).FirstOrDefault();)我知道了。问题是我使用的是.NET2.0。“新哈希集(StringComparer.OrdinalIgnoreCase)”似乎仍然是最快的,因为它是O(1)。您的代码使用for,这使其成为O(N)。