我有一个包含 50 位以上数字的字符串数组。我需要将它们转换为真实世界的整数并按升序排列。当我有不同位数的数字时它会起作用,但在这种情况下,如果所有数字都具有相同的位数,它将不起作用:
string[] unsorted = {"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234234", "324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234235"
,"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234200","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234100","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234731"};
var sorted = unsorted.OrderBy(s => double.Parse(s));
什么是最好的解决方案?
如果您使用整数,您可以将它们解析为BigInteger
(double
和decumal
都是< em>对于这样的数字来说太短了,例如 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#