我正在尝试使用 LINQ 运算符对字母序列进行排序Order
,但没有得到预期的结果。我原以为传递StringComparer.CurrentCulture
会产生与传递 不同的顺序StringComparer.CurrentCultureIgnoreCase
,但两者似乎都忽略了我字母的大小写:
string[] letters = ["y", "X", "Z"];
Console.WriteLine(String.Join(", ", letters.Order(StringComparer.CurrentCulture)));
Console.WriteLine(String.Join(", ", letters.Order(StringComparer.CurrentCultureIgnoreCase)));
输出:
X, y, Z
X, y, Z
在线演示。
我期望 会对CurrentCulture
字母的大小写敏感,并且会产生这样的顺序:X, Z, y
,因为小英文字母在 ASCII 图表中比大写英文字母更远。我理解不正确是什么?
当您有两个具有“相同”字符串/文本但可能有不同情况的值时,
StringComparer.CurrentCulture
和的区别是相关的。StringComparer.CurrentCultureIgnoreCase
在您的示例中,["y", "X", "Z"]
字符串都是“不同的”,因为“x”仍然位于“y”之前,而“y”仍然位于“z”之前。这与这些字符串的大小写无关。但是,当排序算法看到一个列表时,如果值和应该在排序方面相同(因此该方法返回)或者它们应该不同(因此该方法将返回/或任何其他值更小/更大的零,则
["x", "X", "X", "x", "x", "X"]
存在差异)。"x"
"X"
Compare()
0
Compare()
-1
1
当您使用以下代码时:
你会得到以下结果:
在第二行中,所有“相同”字母彼此相等,按照指示忽略大小写。并且由于排序算法是稳定的,“相同”字母的相对顺序仍然保持相同的原始顺序(这里是字母“y”):
据我了解,他的发生是因为那些比较器执行语言比较:
你已经预料到了序数。
来自文档:
因此切换到原来的对应项:
将产生预期的输出:
演示@sharplab.io