我有包含50 + - 数字的字符串数组。我需要将它们转换为真实世界的整数并按升序排序。当我的数字具有不同大小的数字位数时,它会起作用,但在这种情况下,所有具有相同大小的数字的数字都不会起作用:
string[] unsorted = {"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234234", "324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234235"
,"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234200","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234100","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234731"};
var sorted = unsorted.OrderBy(s => double.Parse(s));
什么是最好的解决方案?
答案 0 :(得分:3)
如果您正在使用整数,则可以将其解析为BigInteger
(double
和decumal
太短这些数字,例如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
方法:
-
,那么它会先出现。-
然后修剪-
,请用结果调用自己,然后否定该结果。,
)。.
)的长度(如果没有)。如果不同,最短是最小的。答案 2 :(得分:-1)
试试这个; (linq中的简单解决方案)它适用于正整数和负整数。
string[] array = { "2525213", "2525211", "-2525214" };
var result = array.OrderBy(x => BigInteger.Parse(x));
foreach (var item in result)
{
Console.WriteLine(item);
}
}