c# - 对数组中的 50+ 位数字进行排序

标签 c# algorithm linq sorting

<分区>

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

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

什么是最好的解决方案?

最佳答案

如果您使用整数,您可以将它们解析为BigInteger(doubledecumal 都是< em>对于这样的数字来说太短了,例如 Decimal.MaxValue == 7922816251426433759354395033529 位):

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#

关于c# - 对数组中的 50+ 位数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378718/

相关文章:

algorithm - n 个圆盘/圆的交点的质心

c# - LINQ .OrderBy 创建嵌套套管

c# - Rosyln 的 ToFullString() 输出是否预期包含先前的 "#endregion"?

c# - 地址匹配 key 算法

Karatsuba 乘法算法的 JavaScript 实现

asp.net - 如何在asp :image with linq?中显示数据库中的图像

linq - EntitySet<IEnumerable<T>> 到 IEnumerable<T>

c# - 无法访问 GridViewRowEventArgs 事件处理程序

c# - 私有(private)保护不起作用

c# - 为什么在 Debug模式下会得到随机数?