C# 将数字字符串拆分为数组

C# 将数字字符串拆分为数组,c#,arrays,C#,Arrays,我有字符串(10325710),我想把字符串拆分成一个数组。将字符串拆分为数组后,数组将是{1,0,3,2,5,7,1,0}。注意字符串中有两个1s和两个0s。我不想拆分“1”和“0”。因此,我希望得到的数组是{10,3,2,5,7,10} 有什么建议吗 我的C#代码: 你可以很容易地手动完成 int i = 0; int len = 0; for (int j = 0; j < s.Length; j++) if (s[j] != '0') len++; in

我有字符串(10325710),我想把字符串拆分成一个数组。将字符串拆分为数组后,数组将是
{1,0,3,2,5,7,1,0}
。注意字符串中有两个
1
s和两个
0
s。我不想拆分“1”和“0”。因此,我希望得到的数组是
{10,3,2,5,7,10}

有什么建议吗

我的C#代码:


你可以很容易地手动完成

int i = 0;

int len = 0;
for (int j = 0; j < s.Length; j++)
    if (s[j] != '0')
        len++;

int[] result = new int[len];
int index = 0;
while (i < s.Length)
{
    if (i < s.Length - 1 && int.Parse(s[i + 1].ToString()) == 0)
    {
        result[index++] = int.Parse(s[i].ToString()) * 10;
        i += 2;
    }
    else
    {
        result[index++] = int.Parse(s[i].ToString());
        i++;
    }
}

return result;
inti=0;
int len=0;
对于(int j=0;j

基本上是将“10”替换为“A”,然后将每个字符视为一个基数为16的数字。

好吧,只需在表中添加一些正则表达式:

Regex.Split(myNumber, @"(?!^)(?=[1-9])");
声明:

var myArray=Regex.Matches(myNumber, @"1?\d").Cast<Match>().Select(p => p.ToString()).ToArray();

你怎么知道数组中没有32?或者只是没有零?我猜,字符串中只有值1..10。但是,这应该明确说明。输出数组中允许的有效整数的范围是多少?是的……myNumber中只有1-10。我喜欢这种方法,如果需求发生变化,将来更容易处理+1您确定这段代码适用于这种情况吗?因为
if(i
行应该抛出
OutOfRangeException
。它甚至不会编译,因为
myNumber
似乎是字符串,而
int.Parse(myNumber[i])
不使用字符。它也不能产生正确的结果。现在似乎起作用了。但是,如果撤消我的否决票,我将使用
int.Parse(myNumber[i].ToString())
而不是
(int)Char.GetNumericValue(myNumber[i])
。我不知道哪一个会占用更少的内存。这是代码优化的问题,但我想,
.ToString()
可能实例化字符串实例,而
GetNumericValue
不应该使用任何额外的内存,这就是我选择后者的原因。@欺骗不确定可扩展的含义。这个问题听起来好像他们只需要解析数字1-10。另外,你通常会否决一个答案,因为它是错误的,而不是因为你认为它不完美;)@在这里,ErenErsönmez Maintainable可能是一个更好的词。通常,您可以通过数千种方式解决问题,因此无法通过是否解决问题来衡量问题的质量,而是通过问题的可维护性(易于修复或修改)来衡量问题的质量。假设OP也想解释20岁和30岁。所有其他解决方案都可以修改(大多数都很容易),以适应新的需求。这一条必须从头重写(即使它很短)。跳出框框思考是非常好的,而且技巧确实很酷。但我认为,这不是解决问题的方法。那么,如果OP想要解释100、1000、电话号码怎么办。。。?所以你否决了一个完全有效的答案,因为它不满足一些根本不存在的要求这是给出有效结果的答案,但IMO本身是无效的。顺便说一下,出于好奇,我分析了500k长度字符串的解决方案。您的速度最快(400ms),占用137M内存。多米尼克的成绩是4.3秒和222米,肯的成绩是5.1秒和712米,我的成绩是1.2秒和61米@如果在.Select()之前添加.AsParallel().AsOrdered(),您可能会得到一些改进。我还没有考虑过并行化字符串。不过,这可能是一个有趣的练习。
Regex.Split(myNumber, @"(?!^)(?=[1-9])");
var myArray=Regex.Matches(myNumber, @"1?\d").Cast<Match>().Select(p => p.ToString()).ToArray();
var myNumber="98765432101032571001210345610789";
var myMatches=Regex.Matches(myNumber, @"1?\d").Cast<Match>();
var myArray=myMatches.Select(p => p.ToString()).ToArray();

var whats_in_myArray="{ "+String.Join(", ", myArray)+" }";
Debug.Print("{0}", whats_in_myArray);
{ 9, 8, 7, 6, 5, 4, 3, 2, 10, 10, 3, 2, 5, 7, 10, 0, 12, 10, 3, 4, 5, 6, 10, 7, 8, 9 }