C# 如何对表示int值的字符串排序

C# 如何对表示int值的字符串排序,c#,arrays,C#,Arrays,我收到一个我无法控制的数组。遗憾的是,尽管所有值都是int值,但它还是以字符串的形式出现 没有更改数组的选项,因此我必须使用它 我想对它们进行排序,但当然,“10”(作为字符串)在“4”(作为字符串)之前。我明白为什么 在不将数组的值转换为int值的情况下,是否有方法将字符串排序为int?我知道转换是一种更好的方法,但我对使用string时的选项很好奇 在本例中,将不存在负值 我的数组可能是 "10" "11" "2" "4" 但我想展示给大家看 "2" "4" "10" "11" 是的,您

我收到一个我无法控制的数组。遗憾的是,尽管所有值都是
int
值,但它还是以字符串的形式出现

没有更改数组的选项,因此我必须使用它

我想对它们进行排序,但当然,“10”(作为字符串)在“4”(作为字符串)之前。我明白为什么

在不将数组的值转换为
int
值的情况下,是否有方法将
字符串排序为
int
?我知道转换是一种更好的方法,但我对使用
string
时的选项很好奇

在本例中,将不存在负值

我的数组可能是

"10"
"11"
"2"
"4"
但我想展示给大家看

"2"
"4"
"10"
"11"

是的,您可以先按字符串的长度排序:

string[] input = /* wherever it comes from */
string[] result = input.OrderBy(s => s.Length).ThenBy(s => s).ToArray();


请注意,这只是针对您对“非解析”特别感兴趣的理论解决方案,仅在字符串不包含负值或前导零且仅包含字符“0”-“9”(无特殊unicode数字符号等)时才有效。在高效代码中,您肯定应该解析字符串以获得正确的结果,正如Servy在注释中已经正确指出的那样

是的,您可以先按字符串的长度排序:

string[] input = /* wherever it comes from */
string[] result = input.OrderBy(s => s.Length).ThenBy(s => s).ToArray();


请注意,这只是针对您对“非解析”特别感兴趣的理论解决方案,仅在字符串不包含负值或前导零且仅包含字符“0”-“9”(无特殊unicode数字符号等)时才有效。在高效代码中,您肯定应该解析字符串以获得正确的结果,正如Servy在注释中已经正确指出的那样

我猜您的意思是必须将它们作为字符串保存,而不是严格禁止您解析它们:

string[] a = GetArray();

a = a.OrderBy(s => int.Parse(s)).ToArray();

我猜您的意思是必须将它们作为字符串保存,而不是严格禁止您解析它们:

string[] a = GetArray();

a = a.OrderBy(s => int.Parse(s)).ToArray();

您可以尝试以下方法:

int maxStringLength = int.MaxValue.ToString().Length;
string[] a = { "1", "11", "20", "2", "10" };
a = a.OrderBy(x => x.PadLeft(maxStringLength, '0')).ToArray();

如果您知道您的数字将有多大,您可以为
maxStringLength

使用一个更合理的值,您可以尝试以下方法:

int maxStringLength = int.MaxValue.ToString().Length;
string[] a = { "1", "11", "20", "2", "10" };
a = a.OrderBy(x => x.PadLeft(maxStringLength, '0')).ToArray();


如果你知道你的数字会有多大,你可以使用一个更合理的值来计算
maxStringLength

根据你的判断,“5”小于“02”@Servy根据OP,字符串将是“2”而不是“02”。问题是没有这样的东西。它说它们都是整数,仅此而已。@MyDaftQuestions是保证非负的字符串吗?@MyDaftQuestions答案不正确,它会产生不正确的结果。您绝对应该解析这些值。这就是您实际获得正确值的方式。你不想这样做并不能改变这样一个事实,那就是你应该这样做。根据你的说法,“5”小于“02”@Servy根据OP,字符串将是“2”而不是“02”。问题说没有这样的事情。它说它们都是整数,仅此而已。@MyDaftQuestions是保证非负的字符串吗?@MyDaftQuestions答案不正确,它会产生不正确的结果。您绝对应该解析这些值。这就是您实际获得正确值的方式。你不想这样做并不能改变这样一个事实,那就是你应该这样做。为什么你不能将它们转换成
int
s
strings.OrderBy(int.Parse)
显然是这样做的。为什么不能将它们转换为
int
s
strings.OrderBy(int.Parse)
将是显而易见的方法。我很感激这可能是更好的答案,因为这是更好的方法,但由于我的问题是关于理解我对字符串的选择,我给出了一个加号1@MyDaftQuestions啊,好的。我说过我只是在猜测!干杯。这可能是我最后要做的,但我的问题不是关于它。如果我愿意,我会再加一个+1could@MyDaftQuestions哦,是的,并不是所有的问题都必须是“在生产代码中做这件事最令人尊敬的无聊方式是什么”。我写了各种奇怪的代码只是为了它。我曾经用Perl编写过一个二进制加法器。谈论无用。我很感激这可能是一个更好的答案,因为这是一个更好的方法,但由于我的问题是关于理解我的字符串选项,我给了一个加号1@MyDaftQuestions啊,好的。我说过我只是在猜测!干杯。这可能是我最后要做的,但我的问题不是关于它。如果我愿意,我会再加一个+1could@MyDaftQuestions哦,是的,并不是所有的问题都必须是“在生产代码中做这件事最令人尊敬的无聊方式是什么”。我写了各种奇怪的代码只是为了它。我曾经用Perl编写过一个二进制加法器。谈论无用的东西。