C#中的StringComparison与CompareOptions?

Posted

技术标签:

【中文标题】C#中的StringComparison与CompareOptions?【英文标题】:StringComparison vs CompareOptions in C#? 【发布时间】:2013-01-11 19:23:43 【问题描述】:

看完this我还是一头雾水:

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

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

以下代码的结果是False

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

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

看来我得一路走下去才能用

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

喜欢

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

但是,我目前的文化是he-IL,所以我不知道它为什么会起作用。

所以:

我无法理解 CompareOptions 什么时候不起作用,尽管我使用了 StringComparison.InvariantCulture ( 请不要将我引用到 msdn 页面,因为我已经阅读了它,但我没有t完全理解他们的解释)

简单来说,我应该什么时候使用每个重载?

nonspacing combining characters 不是文化吗?

【问题讨论】:

InvariantCulture 基本上是一种不变的英语,用于序列化或配置文件等内容,但不适用于比较。 @sixlettervariables 谢谢。但是,如果您认为您的回答让我理解了我提出的那些问题,那您就错了....:-)...(以及不变的英语是什么意思) ée 是否相同取决于文化。 InvariantCulture 没有理由在这里支持特定的观点。 这个***.com/questions/2423377/… 和这个***.com/questions/492799/… 几乎是重复的,结合起来可能会回答你的问题。 @Pete:我没有冒犯,在这种情况下直率是完美的。我正在研究一个实际的答案。 【参考方案1】:

您对InvariantCulture 的混淆很常见。 最好的用途是当您在文件中保存数据并且不关心给定文化的奇怪之处(例如 , 作为小数分隔符或带有“u”的拼写风格时) )。

它在比较中的用途有限,尤其是当您需要特定文化的行为时。从表面上看,这似乎并不明显,但是将带有尖锐口音的 e 与没有重音的 e 进行比较...嗯,这取决于情况。

啊哈!视情况而定。

看起来像文化特定过载的工作。只要您知道自己使用的是哪种文化,就应该将这种文化传承下去。

在这种情况下,您希望 .Net 忽略变音符号 (p. ex. 重音 aigu),因此您还应该使用接受 CompareOptions 的重载(特别是您注意到 @ 987654325@)。

【讨论】:

以上是关于C#中的StringComparison与CompareOptions?的主要内容,如果未能解决你的问题,请参考以下文章

StringComparison.Ordinal 是不是与 InvariantCulture 相同,用于测试相等性?

如何用c#中的变量值替换字符串?

我啥时候应该使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture 来测试字符串是不是相等?

StringComparison.InvariantCulture 澄清?

StringComparison 枚举的选项

在 .Net Standard 2.0 中替换 string.Contains(string, StringComparison)