gpt4 book ai didi

c# - 如何对任意大数字的 List 进行排序?

转载 作者:行者123 更新时间:2023-12-02 18:05:40 35 4
gpt4 key购买 nike

在 C# 中,如何对大数列表进行排序,使得带有 - 减号字符的负数也按正确的顺序排列?

我知道 int 可以容纳最大数量的数字。 10位数字和ulong可以容纳大约20位数字。但我有一个 24~30 位数字的列表,其中包括负数。

我认为执行此操作的方法是添加一个用 0 填充的字符串,然后对该新字符串进行排序。因此,1234 变为 0001234。对于负数,-567 变为 9999432,因为它是反向排序的。请参阅下面的代码

private void TestingList()
{
// test values
List<string> Values123 = new List<string> {
"123456789012345678901234",
"-61309282998165063700291",
"72413799900717492396359",
"-10076416403816370211636",
"123191989931658420157210",
"-675299502697548089298418",
"554706403711546488433874",
"-882666356021157245451325",
"877873677336436172875781",
"-695217734376922329970499"
};
//List<string> Values123 = new List<string> {"2222", "4444", "3333", "1111", "5555"};

// create a sortable list, of type List<String, String>
var Test123 = new List<KeyValuePair<string, string>>();
foreach (var v in Values123)
{
Test123.Add(new KeyValuePair<string, string>(sortableValue(v), v));
}

// sort the list oin the sortable key
var Sorted123 = Test123.OrderBy(x => x.Key).ToList();

// print list
foreach (var s in Sorted123)
{
Console.WriteLine(String.Format("{0} -> {1}", s.Key, s.Value));
}

}

创建可排序字符串的函数如下所示。

private string sortableValue(string val)
{
if (val.IndexOf('-') < 0)
// not negative
return val.PadLeft(30, '0');
else
{
// negative numbers
var ret = "";
foreach (char c in val) {
var test123 = c;
if ((c >= '0') && (c <= '9')) {
// '0'..'9' = ascii 48..57
//c = Convert.ToChar(48+57 - c);
test123 = (char)(48 + 57 - c);
} else if (c == '-') {
test123 = '9';
}
ret += test123;
}
return ret.PadLeft(30, '9');
};
}

结果接近我想要的,但不完全是。

Key sorted                        String value
000000072413799900717492396359 -> 72413799900717492396359
000000123191989931658420157210 -> 123191989931658420157210
000000123456789012345678901234 -> 123456789012345678901234
000000554706403711546488433874 -> 554706403711546488433874
000000877873677336436172875781 -> 877873677336436172875781
999999117333643978842754548674 -> -882666356021157245451325
999999304782265623077670029500 -> -695217734376922329970499
999999324700497302451910701581 -> -675299502697548089298418
999999938690717001834936299708 -> -61309282998165063700291
999999989923583596183629788363 -> -10076416403816370211636

排序后的字符串值应按以下顺序排列:

-882666356021157245451325
-695217734376922329970499
-675299502697548089298418
-61309282998165063700291
-10076416403816370211636
72413799900717492396359
123191989931658420157210
123456789012345678901234
554706403711546488433874
877873677336436172875781

有没有办法通过一些额外的排序选项或类似的东西来获得这个结果?或者有更好的方法来解决这个问题吗?

编辑:我刚刚意识到我还可以向排序键添加一个额外的 09 来翻转正值和负值并获得所需的排序。因此,像这样更改两行 return 行(仍然有点hackey,但它完成了工作):

if (val.IndexOf('-') < 0)
return "9" + val.PadLeft(30, '0'); // positive numbers
//etc.
return "0" + ret.PadLeft(30, '9'); // negative numbers

最佳答案

正如评论中提到的,System.Numeric.BigInteger 是可行的方法。您所要做的就是:

IEnumerable<string> sorted123 = Values123.OrderBy(v => BigInteger.Parse(v));

你会得到结果:

-882666356021157245451325
-695217734376922329970499
-675299502697548089298418
-61309282998165063700291
-10076416403816370211636
72413799900717492396359
123191989931658420157210
123456789012345678901234
554706403711546488433874
877873677336436172875781

.NET Fiddle here 的完整示例。

关于c# - 如何对任意大数字的 List<String> 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73345788/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com