c# – 字符串排序问题

前端之家收集整理的这篇文章主要介绍了c# – 字符串排序问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下编译为Sort.exe的C#代码
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. class Test
  5. {
  6. public static int Main(string[] args)
  7. {
  8. string text = null;
  9. List<string> lines = new List<string>();
  10. while((text = Console.In.ReadLine()) != null)
  11. {
  12. lines.Add(text);
  13. }
  14.  
  15. lines.Sort();
  16.  
  17. foreach(var line in lines)
  18. Console.WriteLine(line);
  19.  
  20. return 0;
  21. }
  22. }

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

  1. x000000000000000000093.000000000
  2. x000000000000000000037.000000000
  3. x000000000000000100000.000000000
  4. x000000000000000000538.000000000
  5. x-00000000000000000020.000000000

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

  1. C:\Users\girijesh\AppData\Local\Temp>sort < input.txt
  2. x000000000000000000037.000000000
  3. x000000000000000000093.000000000
  4. x-00000000000000000020.000000000
  5. x000000000000000000538.000000000
  6. x000000000000000100000.000000000

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

解决方法

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

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

  1. lines.Sort(StringComparer.Ordinal);

然后你的结果是:

  1. x-00000000000000000020.000000000
  2. x000000000000000000037.000000000
  3. x000000000000000000093.000000000
  4. x000000000000000000538.000000000
  5. x000000000000000100000.000000000

如果你想知道-… 20.0值为什么会在它所做的地方结束,那么考虑一下如果删除了 – (并与上面的前列表进行比较)会是什么样子.

  1. x000000000000000000037.000000000
  2. x000000000000000000093.000000000
  3. x00000000000000000020.000000000
  4. x000000000000000000538.000000000
  5. x000000000000000100000.000000000

如果您的输入始终采用x [某个数字]的格式,我会将x之后的值解析为十进制或双精度,然后对其进行排序.这样可以更容易地确保预期的行为,并且总体上更好.

猜你在找的C#相关文章