- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
有没有办法通过一些额外的排序选项或类似的东西来获得这个结果?或者有更好的方法来解决这个问题吗?
编辑:我刚刚意识到我还可以向排序键添加一个额外的 0
或 9
来翻转正值和负值并获得所需的排序。因此,像这样更改两行 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/
如果您想使用 String.Concat() 连接 5 个或更多字符串,则它会使用 Concat(String[])。 为什么不一直使用 Concat(String[]) 而不再需要 Concat(S
今天在使用 String 时,我遇到了一种我以前不知道的行为。我无法理解内部发生的事情。 public String returnVal(){ return "5";
似乎在我所看到的任何地方,都有一些过时的版本,这些版本不再起作用。 我的问题似乎很简单。我有一个Java类,它映射到derby数据库。我正在使用注释,并且已经成功地在数据库中创建了所有其他表,但是在这
一、string::size_type() 在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据
我正在尝试将数据保存到我的 plist 文件中,其中包含字符串数组的定义。我的plist - enter image description here 我将数据写入 plist 的代码是 -- let
我有一个带有键/值对的 JavaScript 对象,其中值是字符串数组: var errors = { "Message": ["Error #1", "Error #2"], "Em
例如,为了使用相同的函数迭代 List 和 List> ,我可以编写如下内容: import java.util.*; public class Test{ public static voi
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
这是我的 jsp 文件: 我遇到了错误 The method replace(String, String, String) in the type Functions is not appl
我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(每行中的每个项目)。列表项是字符串数组。问题是,当我调用 string.Join 时,它返回文字字符串 "System.Strin
一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string s
给定类: public class CategoryValuePair { String category; String value; } 还有一个方法: public
我正在尝试合并 Stream>>对象与所有 Streams 中的键一起映射到单个映射中. 例如, final Map someObject; final List>> list = someObjec
在这里使用 IDictionary 的值(value)是什么? 最佳答案 使用接口(interface)的值(value)始终相同:切换到另一个后端实现时,您不必更改客户端代码。 请考虑稍后分析您的代
我可以知道这两个字典声明之间的区别吗? var places = [String: String]() var places = [Dictionary()] 为什么当我尝试以这种方式附加声明时,只有
在 .NET 4.0 及更高版本中存在 string.IsNullOrWhiteSpace(string) 时,在检查字符串时使用 string.IsNullOrEmpty(string) 是否被视为
这个名字背后的原因是什么? SS64在 PowerShell 中解释此处的字符串如下: A here string is a single-quoted or double-quoted string
我打算离开 this 文章,尝试编写一个接受字符串和 &str 的函数,但我遇到了问题。我有以下功能: pub fn new(t_num: S) -> BigNum where S: Into {
我有一个结构为 [String: [String: String]] 的多维数组。我可以使用 for 循环到达 [String: String] 位,但我不知道如何访问主键(这个位 [String:
我正在尝试使用 sarama(管理员模式)创建主题。没有 ConfigEntries 工作正常。但我需要定义一些配置。 我设置了主题配置(这里发生了错误): tConfigs := map[s
我是一名优秀的程序员,十分优秀!