我怎么找不到这个问题的解决方案?
我有一个包含数字的char
数组,我想把它们连接到一个int
。
我尝试了Convert.ToInt32
,int.parse
string.join
和其他技巧,但我不知道如何正确使用它们,或者它们不适合工作。
这是一个赋值,通过返回一个值给测试,我得到的是一个:System。FormatException:输入字符串格式不正确。这就是我怎么知道有什么不对劲的。
我的代码到目前为止(重点是注释):
public static int? NextBiggerThan(int number)
{
if (number < 0)
{
throw new ArgumentException(null);
}
else
{
char[] digit = number.ToString(CultureInfo.InvariantCulture.NumberFormat).ToCharArray();
int n = digit.Length;
//
for (int z = 0; z < n; z++)
{
digit[z] -= '0';
}
int i;
for (i = n - 1; i > 0; i--)
{
if (digit[i] > digit[i - 1])
{
break;
}
}
if (i == 0)
{
return null;
}
else
{
int x = digit[i - 1], min = i;
for (int j = i + 1; j < n; j++)
{
if (digit[j] > x && digit[j] < digit[min])
{
min = j;
}
}
Swap(digit, i - 1, min);
Array.Sort(digit, i, n - i);
// number = ?????
return number;
}
}
}
public static void Swap(char[] digit, int i, int j)
{
char temp = digit[i];
digit[i] = digit[j];
digit[j] = temp;
}
其余的代码工作得很好,如果我return
例如digit[0]
,那么它返回我想要的值,但是当我尝试在末尾连接所有东西时,会出现问题。
Join
和int.Parse
可以正常工作:
namespace SandboxTests
{
public static class Extension
{
public static int ToInt(this char[] arr)
{
var str = string.Join("", arr);
return int.Parse(str);
}
}
[TestClass]
public class JoinParseTests
{
[TestMethod]
public void ExtensionToIntTest()
{
var sut = new[] { '3', '2', '1' };
var intResult = sut.ToInt();
Assert.AreEqual(321, intResult); // green
}
}
}
你应该真正帮助我们帮助你,通过限制你的代码只针对手头的问题。也就是说,您可以连接并解析一个数字字符数组:
using System;
public class Program
{
public static void Main()
{
char[] inNumberArray = new char[]{'1','2','0','5'};
var asString = string.Join("", inNumberArray);
var asInt = int.TryParse(asString, out int outNum)?outNum:0;
Console.WriteLine($"asString: {asString}");
Console.WriteLine($"asInt: {asInt}");
}
}
输出:
asString结尾:1205
asInt: 1205
看:https://dotnetfiddle.net/wRQwLt
我们可以结合两个事实:
- 表示字符可以像整型一样处理并减去
- 在ascii中,数字'0'到'9'按顺序出现。
这意味着,例如,'5'
的char减去'0'
的char是5
的int
LINQ有一个方法可以做到这一点;我们运行一个以0为种子的Aggregate,它重复地将这个开始的int值(0)乘以10,并将数字添加到它
var arr = new []{'9','8','4','2','5'};
var sum = arr.Aggregate(0, (acc, x) => acc*10 + x - '0');
你也可以不使用LINQ:
var arr = new []{'9','8','4','2','5'};
var sum = 0;
foreach(char c in arr)
sum = sum*10 + (x-'0');
总的来说,这个方法很大程度上是基于数学的,避免将所有内容连接到一个字符串并解析它应该意味着它是一个资源密集的选项