C# 字母顺序不从左到右比较?

C# 字母顺序不从左到右比较?,c#,.net,string,sorting,.net-4.0,C#,.net,String,Sorting,.net 4.0,我认为在.NET中,字符串是按字母顺序比较的,它们是从左到右比较的 string[] strings = { "-1", "1", "1Foo", "-1Foo" }; Array.Sort(strings); Console.WriteLine(string.Join(",", strings)); 我希望是这样的(或者两者都在开头加上负号): 但结果是: 1,-1,1Foo,-1Foo 这似乎是一种混合,要么忽略减号,要么比较多个字符,即使第一个字符已经不同 编辑:我现在已经测试了ord

我认为在.NET中,字符串是按字母顺序比较的,它们是从左到右比较的

string[] strings = { "-1", "1", "1Foo", "-1Foo" };
Array.Sort(strings);
Console.WriteLine(string.Join(",", strings));
我希望是这样的(或者两者都在开头加上负号):

但结果是:

1,-1,1Foo,-1Foo
这似乎是一种混合,要么忽略减号,要么比较多个字符,即使第一个字符已经不同

编辑:我现在已经测试了
ordinallingorecase
,得到了预期的顺序:

Array.Sort(strings, StringComparer.OrdinalIgnoreCase);

但是,即使我使用了
InvariantCultureIgnoreCase
我也会得到意想不到的顺序。

方法文档中有一个小注释:

致电人士须知:

字符集包括可忽略的字符。这个 Cuffalto(String)方法不考虑这样的字符 执行区域性敏感比较。例如,如果: 代码在.NET Framework 4或更高版本上运行,与“animal”比较 使用“ani mal”(使用软连字符或U+00AD)表示 字符串是等价的

再过一会儿,他说:

要识别字符串比较中的可忽略字符,请调用 CompareOrdinal(String,String)方法

这两种说法似乎与你所看到的结果一致。

乔恩·斯凯特去救援

具体而言:

NET Framework使用三种不同的排序方式:单词排序, 字符串排序和顺序排序。单词排序执行区域性敏感 字符串的比较。某些非字母数字字符可能具有 分配给它们的特殊权重。例如,连字符(“-”)可能 给它分配一个很小的权重,以便“合作”和“合作” 在排序列表中彼此相邻显示。字符串排序类似于 单词排序,除了没有特殊情况。因此,所有 非字母数字符号位于所有字母数字字符之前。 序号排序基于每个字符串的Unicode值比较字符串 字符串的元素

但添加StringComparer.Ordinal会使其按您的需要运行:

string[] strings = { "-1", "1", "10", "-10", "a", "ba","-a" };      
Array.Sort(strings,StringComparer.Ordinal );
Console.WriteLine(string.Join(",", strings));
// prints: -1,-10,-a,1,10,a,ba
编辑
关于序数,引用自

序号表示字符串比较必须使用连续的 字符串的Unicode UTF-16编码值(逐个代码单元 比较),导致快速比较,但是 文化不敏感。以代码单元XX16开头的字符串出现 如果XX16小于YYYY16,则在以YYYY16开头的字符串之前。 此值不能与其他CompareOptions值和 必须单独使用

如果你想要两个字符串的序数,你也有

下面是另一个有趣的注意事项:

如果可能,应用程序应该使用字符串比较方法 接受CompareOptions值以指定比较类型的 预期。一般来说,面向用户的比较是最好的 通过使用语言选项(使用当前文化),而 安全性比较应指定Ordinal或OrdinalIgnoreCase


我想我们人类在处理字符串时希望使用序号:)

字母表中的“-”落在哪里?可能与连字符的单词有关。不要在字典里改变它们的顺序。比较(“1”,“1Foo”,StringComparison.InvariantCultureInogoreCase)与此
字符串。比较(“-1”,“1Foo”,StringComparison.InvariantCultureInogoreCase)
。两次您都会得到-1。他可能会使用
de
区域性作为当前值。这不是特定于区域性的,这对于.NET中的所有区域性都是相同的。您应该使用
StringComparer.Ordinal
。但连字符并没有完全被忽略。尝试比较
“animal”
“animal”
并进行双向比较,切换值时会得到一个值,而
“1”
“-1Foo”
相比,然后切换连字符则不会。这并不是唯一的答案。而且,即使我使用,我也会得到同样的结果,但你已经引用了:“当它进行文化敏感的比较时”。顺便说一下,如果有必要的话,我真的在使用.NET4。谢谢,谢谢。但是如果我使用
InvariantCulture
它不应该通过使用任何区域性进行比较。如果我正确理解了你的报价,那应该是指“字符串排序”,它没有像
-
这样的特殊情况。这是否意味着如果我不使用
序号
,则顺序是任意的/不可预测的?
string[] strings = { "-1", "1", "10", "-10", "a", "ba","-a" };      
Array.Sort(strings,StringComparer.Ordinal );
Console.WriteLine(string.Join(",", strings));
// prints: -1,-10,-a,1,10,a,ba