8
723
77715926535897932384626433832795
通常我会将它们放入数组并使用Sort
方法以数字方式对它们进行排序。
但是,上述值太大而无法放入Int64
,如果使用string
数组,则会在77715926535897932384626433832795
之后产生意外结果。如何排序如此大的价值?
答案 0 :(得分:2)
您可以使用int64
命名空间中的BigInteger
类,而不是使用System.Numerics
来存储您的值。
如果你想使用原始类型,那么 float,double,long 就是你的选择。
Primitive data types,大致长度
有关以下内容的详细信息:System.Numerics
对BigInteger进行排序:Look at this example
现在选择是你的。快乐的编码
答案 1 :(得分:2)
如果您没有要求值必须是整数,则可以对所有值使用double
而不是Int64
。 double
的最大值是1.7976931348623157E + 308,因此它比您显示的示例大得多。这也可能是一个简单的代码更改。 BigInteger
会像人们提到的那样需要进行其他一些代码更改。
答案 2 :(得分:2)
您始终可以按长度排序,然后按值排序:
var numbers = new []
{
"8",
"77715926535897932384626433832795",
"723",
};
var sorted =
numbers
.OrderBy(n => n.Length)
.ThenBy(n => n)
.ToArray();
这给出了:
8 723 77715926535897932384626433832795
答案 3 :(得分:2)
最佳选择是使用容量更大的数值数据类型。最大的数值数据类型是decimal,它具有96位精度(大约28位)。介于两者之间还有一些其他数据类型。通常,最好使用足够大的数据类型。对于浮点数据类型,当有效位数太多时,请注意精度损失。
如果您使用的数字如此之大,以至于它们不适合任何数值数据类型,您可以通过用零填充来对任意长整数进行排序,使它们的长度都相同。
{{1}}
答案 4 :(得分:0)
在这种情况下,可以分两步完成排序。
1.Sort基于字符串的长度。 (删除任何前导零)。
2.之后排除字符串。
string[] numbers = { "9", "33", "11", "22", "723", "8", "77715926535897932384626433832795" };
Array.Sort(numbers, (x, y) =>
{
int val = x.Length - y.Length;
if (val == 0)
{
val = x.CompareTo(y);
}
return val;
});
输出:
"8"
"9"
"11"
"22"
"33"
"723"
"909"
"77715926535897932384626433832795"
答案 5 :(得分:0)
我在其他网站找到了答案如下:
string[] unsorted = { "77715926535897932384626433832795", "2398798734", "11" };
Array.Sort(unsorted,(string a,string b) => {
if(a.Length == b.Length)
return string.Compare(a,b,StringComparison.Ordinal);
return a.Length - b.Length;
});
如果我理解正确,这将使用RAW字节比较每个元素,因此效率最高。