2008-10-09 69 views
19

如果我想有一个不区分大小写字符串键的字典,它StringComparer的版本,我应该用给了这些约束:哪个StringComparer的版本使用

  • 在字典中的键无论从C#代码来或者写在英语语言环境中只(无论是美国或英国)
  • 该软件是国际化,会在不同的语言环境中运行
  • 配置文件

我通常使用StringComparer.InvariantCultureIgnoreCase,但不知道如果这是正确的案件。下面是示例代码:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase); 

回答

11

This MSDN article涵盖你可能想在大深度,包括土耳其,我的问题知道的一切。

自从我读了它已经有一段时间了,所以我不得不再次这样做。在一小时内见到你!

1

由于密钥是你已知的固定值,那么无论InvariantCultureIgnoreCase或OrdinalIgnoreCase应该工作。避免特定于文化的问题,或者你可以选择一些更“有趣”的东西,比如“土耳其我”问题。很明显,如果你比较文化价值,你会使用培养的比较者...但听起来你不是。

3

“不区分大小写”的概念是一种语言的概念,所以没有文化就没有意义。

有关更多信息,请参阅此blog

这就是说,如果你只是谈论使用拉丁字母的字符串,那么你可能会逃避InvariantCulture。

尽管可能最好使用StringComparer.CurrentCulture创建字典。例如,这将允许“ß”在德语文化下的字典中匹配“ss”。

1

StringComparer.OrdinalIgnoreCase比InvariantCultureIgnoreCase FWIW稍快(“一个序号比较快,但文化不敏感”,根据MSDN

你不得不做很多比较注意到的差异当然。

0

不变区域性特别的存在是为了对付那些内部的程序,并没有任何跟用户数据或UI字符串。听起来这是造成这种状况的情况。

27

有三种种类的比较器:

  • 文化感知
  • 文化不变

每个比较器具有区分大小写以及一个不区分大小写版本。

一个序数比较器使用字符的序数值。这是最快的比较器,它应该用于内部目的。

A 文化意识比较器考虑特定于当前线程文化的方面。它知道“土耳其我”,“西班牙语LL”等问题。它应该用于UI字符串。

文化不变比较器实际上没有定义,并且可能产生不可预知的结果,因此根本不应该使用。

参考

  1. New Recommendations for Using Strings in Microsoft .NET 2.0
+0

这很好,很甜。在数据库中查找.. – nawfal 2013-06-06 06:17:17

0

System.Collections.Specialized包含StringDictionary。在MSDN的备注部分指出“键不能为空,但是一个值可以

的关键是在不区分大小写的方式处理;它被翻译它与串字典使用之前为小写

在.NET Framework 1.0版中,此类使用文化敏感字符串比较,但在.NET Framework 1.1及更高版本中,此类在比较字符串时使用CultureInfo.InvariantCulture。有关文化如何影响比较和排序的更多信息,请参阅比较和排序特定文化的数据并执行不区分文化的字符串操作。