无法按字母顺序比较字符串
Can't compare strings by alphabetical order
我的数据库按字母顺序存储键:
-MmNI8oyb2QE_9V0WdaX \1st (oldest)
-MmOAFDL9ZPD1gx4SjEU \2nd
-MmPtIJ1LpFTRbweNWvD \3rd
-MmPtd0IMuNIEYaPYPgZ \4th (newest)
此列表的排序顺序正确you can check here that it's an alphabetical order。第一个字符串最小,然后是第二个、第三个和第四个。
我想比较该列表中的每两个字符串,并获得正确的结果,例如该特定列表的顺序,因此如果我将第 4 个字符串与第 3 个字符串进行比较,我将收到第 4 个结果比第三大。
到目前为止我尝试了什么:使用 string.Compare
,但是它不适用于我的特定列表
我收到的结果不一致
string first="-MmNI8oyb2QE_9V0WdaX";
string second="-MmOAFDL9ZPD1gx4SjEU";
string third="-MmPtIJ1LpFTRbweNWvD";
string fourth="-MmPtd0IMuNIEYaPYPgZ";
string.Compare(third,fourth) //output: 1
string.Compare(second,third) //output: -1
string.Compare(first,second) //output: -1
(输出应全部为“1”或“-1”。因为我的列表已排序)
我应该使用什么函数而不是比较字符串?我还尝试了 string.Compare(3rd,4th,false)
一个按大小写比较的重载,但没有帮助,我猜它必须对大小写做一些事情
您似乎真的想按这些字符串的序数值(它们的二进制表示)对这些字符串进行排序。在这种情况下,使用 StringComparison.Ordinal
作为比较类型。
string.Compare(third, fourth, StringComparison.Ordinal)); //output: -27
string.Compare(second, third, StringComparison.Ordinal)); //output: -1
string.Compare(first, second, StringComparison.Ordinal)); //output: -1
奇怪的是,第一个比较结果是 -27 而不是 -1。 Compare 方法仅指定 return 值将是 <1、0 或 >1,因此这三个输出本质上(和语义上)是相同的结果。
这是一个有趣的现象,可能是由 .NET 执行单词排序比较引起的,使用加权排序规则将相似的单词放在一起 (see remarks here)。
它会导致一些有趣的、意想不到的结果。即使区分大小写为 false
:
string.Compare("A", "c", false); // -1
string.Compare("a", "c", false); // -1
string.Compare("E", "c", false); // 1
string.Compare("e", "c", false); // 1
对于使用字符代码排序的严格比较,您想使用 Ordinal
比较方法。
// UPPERCASE letters come before lowercase.
string.Compare("A", "c", StringComparison.Ordinal); // -34
string.Compare("a", "c", StringComparison.Ordinal); // -2
string.Compare("E", "c", StringComparison.Ordinal); // -30
string.Compare("e", "c", StringComparison.Ordinal); // 2
我的数据库按字母顺序存储键:
-MmNI8oyb2QE_9V0WdaX \1st (oldest)
-MmOAFDL9ZPD1gx4SjEU \2nd
-MmPtIJ1LpFTRbweNWvD \3rd
-MmPtd0IMuNIEYaPYPgZ \4th (newest)
此列表的排序顺序正确you can check here that it's an alphabetical order。第一个字符串最小,然后是第二个、第三个和第四个。
我想比较该列表中的每两个字符串,并获得正确的结果,例如该特定列表的顺序,因此如果我将第 4 个字符串与第 3 个字符串进行比较,我将收到第 4 个结果比第三大。
到目前为止我尝试了什么:使用 string.Compare
,但是它不适用于我的特定列表
我收到的结果不一致
string first="-MmNI8oyb2QE_9V0WdaX";
string second="-MmOAFDL9ZPD1gx4SjEU";
string third="-MmPtIJ1LpFTRbweNWvD";
string fourth="-MmPtd0IMuNIEYaPYPgZ";
string.Compare(third,fourth) //output: 1
string.Compare(second,third) //output: -1
string.Compare(first,second) //output: -1
(输出应全部为“1”或“-1”。因为我的列表已排序)
我应该使用什么函数而不是比较字符串?我还尝试了 string.Compare(3rd,4th,false)
一个按大小写比较的重载,但没有帮助,我猜它必须对大小写做一些事情
您似乎真的想按这些字符串的序数值(它们的二进制表示)对这些字符串进行排序。在这种情况下,使用 StringComparison.Ordinal
作为比较类型。
string.Compare(third, fourth, StringComparison.Ordinal)); //output: -27
string.Compare(second, third, StringComparison.Ordinal)); //output: -1
string.Compare(first, second, StringComparison.Ordinal)); //output: -1
奇怪的是,第一个比较结果是 -27 而不是 -1。 Compare 方法仅指定 return 值将是 <1、0 或 >1,因此这三个输出本质上(和语义上)是相同的结果。
这是一个有趣的现象,可能是由 .NET 执行单词排序比较引起的,使用加权排序规则将相似的单词放在一起 (see remarks here)。
它会导致一些有趣的、意想不到的结果。即使区分大小写为 false
:
string.Compare("A", "c", false); // -1
string.Compare("a", "c", false); // -1
string.Compare("E", "c", false); // 1
string.Compare("e", "c", false); // 1
对于使用字符代码排序的严格比较,您想使用 Ordinal
比较方法。
// UPPERCASE letters come before lowercase.
string.Compare("A", "c", StringComparison.Ordinal); // -34
string.Compare("a", "c", StringComparison.Ordinal); // -2
string.Compare("E", "c", StringComparison.Ordinal); // -30
string.Compare("e", "c", StringComparison.Ordinal); // 2