我有以下编译为Sort.exe的C#代码:
using System;
using System.Collections.Generic;
class Test
{
public static int Main(string[] args)
{
string text = null;
List<string> lines = new List<string>();
while((text = Console.In.ReadLine()) != null)
{
lines.Add(text);
}
lines.Sort();
foreach(var line in lines)
Console.WriteLine(line);
return 0;
}
}
我有一个文件input.txt,其内容有以下5行:
x000000000000000000093.000000000
x000000000000000000037.000000000
x000000000000000100000.000000000
x000000000000000000538.000000000
x-00000000000000000020.000000000
现在,如果我在命令提示符下运行它,则输出:
C:\Users\girijesh\AppData\Local\Temp>sort < input.txt
x000000000000000000037.000000000
x000000000000000000093.000000000
x-00000000000000000020.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
我无法理解从x-
开始的字符串(输出中的第3行)出现在以x0
开头的字符串中间的字符串排序类型。第三行应该位于顶部或底部。 Excel也显示相同的行为。
答案 0 :(得分:6)
在许多文化中(包括不变文化),连字符是一个对排序目的而言不太重要的字符。在大多数文本中,这是有道理的:pre-whatever
和prewhatever
非常相似。例如,以下列表按此排序,我认为这是好的:
preasdf
prewhatever
pre-whatever
prezxcv
您似乎想要进行Ordinal
比较,其中值仅通过其unicode代码点值进行比较。如果您将行更改为:
lines.Sort(StringComparer.Ordinal);
然后你的结果是:
x-00000000000000000020.000000000
x000000000000000000037.000000000
x000000000000000000093.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
如果您想知道为什么-...20.0
值最终会达到最大值,请考虑删除-
后的情况(并与上述pre
列表进行比较)。
x000000000000000000037.000000000
x000000000000000000093.000000000
x00000000000000000020.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
如果您的输入始终采用x[some number]
格式,我会将x
之后的值解析为decimal
或double
,然后对其进行排序。这样可以更容易地确保预期的行为,并且总体上更好。