在数组中排序50 + - 数字

时间:2017-02-21 21:54:06

标签: c# algorithm linq sorting

我有包含50 + - 数字的字符串数组。我需要将它们转换为真实世界的整数并按升序排序。当我的数字具有不同大小的数字位数时,它会起作用,但在这种情况下,所有具有相同大小的数字的数字都不会起作用:

string[] unsorted = {"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234234", "324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234235"
        ,"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234200","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234100","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234731"};
var sorted = unsorted.OrderBy(s => double.Parse(s));

什么是最好的解决方案?

3 个答案:

答案 0 :(得分:3)

如果您正在使用整数,则可以将其解析为BigIntegerdoubledecumal 太短这些数字,例如Decimal.MaxValue == 79228162514264337593543950335,仅 29 数字):

using System.Numerics;

...

string[] data = ...

var ordered = data
  .OrderBy(item => BigInteger.Parse(item))
  .ToArray(); // if you want materialization to array

如果你正在使用非负整数,你可以按长度排序,然后按字典顺序排序(不需要转换):

string[] data = ...

var ordered = data
  .OrderBy(item => item.Length)
  .ThenBy(item => item)
  .ToArray(); // if you want materialization to array

任何整数的相同方法(参见Jason P Sallinger的评论)也是可能的,但不是那么优雅:

  var ordered = data
    .Where(item => item.StartsWith("-"))
    .OrderByDescending(item => item.Length)
    .ThenByDescending(item => item)
    .Concat(data
       .Where(item => !item.StartsWith("-"))
       .OrderBy(item => item.Length)
       .ThenBy(item => item))
    .ToArray();

最后,请看一下 Natural Sort Order in C#

答案 1 :(得分:0)

假设他们被修剪(没有前导零)正整数而没有逗号:

unsorted.OrderBy(s => s.Length).ThenBy(s => s)

会工作,因为比另一个未修剪的数字长的未修剪整数将大于它。

对于否定词:

unsorted.Order(s => s[0] != '-').ThenBy(s => s.Length).ThenBy(s => s)

由于布尔运算符在假之前排序为假,并且您希望以-开头的字符串出现在那些不合适的字符串之前。

如果事情比我更复杂,我会使用IEqualityComparer<string> Compare方法:

  1. 如果只有一个人-,那么它会先出现。
  2. 否则如果他们都有-然后修剪-,请用结果调用自己,然后否定该结果。
  3. 修剪数千个分组(英语使用,)。
  4. 获取每个或全长的小数点分隔符(英语用.)的长度(如果没有)。如果不同,最短是最小的。
  5. 序数字符串比较。

答案 2 :(得分:-1)

试试这个; (linq中的简单解决方案)它适用于正整数和负整数。

string[] array = { "2525213", "2525211", "-2525214" };

        var result = array.OrderBy(x => BigInteger.Parse(x));

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }