StringComparison vs C#中的CompareOptions?

时间:2013-01-11 19:23:44

标签: c# .net string culture

阅读this后,我仍感到困惑:

 string s1 = "hello";
 string s2 = "héllo";

这里的区别在于口音/文化。

以下代码的结果为False

Console.WriteLine(s1.Equals(s2, StringComparison.InvariantCulture));

但是我使用不变的文化,所以它应该把é视为e。(默认是英文,不是吗?)

似乎我必须一直使用

String.Compare(String, String, CultureInfo, CompareOptions) 

  string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace) //true

但是,我现在的文化是he-IL所以我没有CLUE为什么它正在运作。

所以:

  • 虽然我使用了CompareOptions并且请不要将我引用到msdn页面,因为我已经阅读过它),但我无法理解StringComparison.InvariantCulture何时没有工作我并不完全理解他们的解释
  • 简单来说,我什么时候应该使用每个重载?

  • nonspacing combining characters 不是文化事物吗?

1 个答案:

答案 0 :(得分:2)

您对InvariantCulture的困惑非常普遍。 最佳用于此目的的是将数据保存到文件和从文件中保存数据而不关心给定文化的奇怪之处(例如,作为小数分隔符或拼写风格带'' U')。

它在比较中的用途有限,特别是当您需要特定于文化的行为时。在面值上看起来似乎并不明显,但将e与急性重音比较为与没有一个的e相同......那就是情况依赖。

啊哈!你说情况依赖。

看起来像是特定于文化的重载的作业。无论何时你知道你正在使用哪种文化,你都应该传承这种文化。

在这种情况下,你希望.Net忽略变音标记( p.ex.accent aigu ),因此你也应该使用一个接受CompareOptions的重载(特别是当你注意到CompareOptions.IgnoreNonSpace)。