字符串排序问题

use*_*811 6 c# sorting

我有以下编译为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个文件input.txt,其中包含以下5行:

x000000000000000000093.000000000
x000000000000000000037.000000000
x000000000000000100000.000000000
x000000000000000000538.000000000
x-00000000000000000020.000000000
Run Code Online (Sandbox Code Playgroud)

现在,如果我在命令提示符下运行它,则输出如下:

C:\Users\girijesh\AppData\Local\Temp>sort < input.txt
x000000000000000000037.000000000
x000000000000000000093.000000000
x-00000000000000000020.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
Run Code Online (Sandbox Code Playgroud)

我无法理解字符串排序是什么样的字符串开头的字符串x-(输出中的第3行)出现在字符串的中间x0.第三行应该位于顶部或底部.Excel也显示相同的行为.

Tim*_* S. 6

在许多文化中(包括不变文化),连字符是一个对于排序目的而言不太重要的字符.在大多数文本中,这是有道理的:pre-whatever并且prewhatever非常相似.例如,以下列表按此排序,我认为这是好的:

preasdf
prewhatever
pre-whatever
prezxcv
Run Code Online (Sandbox Code Playgroud)

您似乎想要进行Ordinal比较,其中值仅通过其unicode代码点值进行比较.如果您将行更改为:

lines.Sort(StringComparer.Ordinal);
Run Code Online (Sandbox Code Playgroud)

然后你的结果是:

x-00000000000000000020.000000000
x000000000000000000037.000000000
x000000000000000000093.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
Run Code Online (Sandbox Code Playgroud)

如果你想知道为什么-...20.0价值最终落到了它的位置,那么考虑一下如果你删除它-(和上面的pre列表比较)会是什么样子.

x000000000000000000037.000000000
x000000000000000000093.000000000
x00000000000000000020.000000000
x000000000000000000538.000000000
x000000000000000100000.000000000
Run Code Online (Sandbox Code Playgroud)

如果您的输入始终采用格式x[some number],我会在x作为decimal或之后解析该值double,并对其进行排序.这样可以更容易地确保预期的行为,并且总体上更好.