C#:将int[]转换为字符串的最有效方法
我知道这类问题已经回答过很多次了。虽然我已经找到了很多可能的答案,但它们仍然不能解决我的问题,这就是实现将整数数组转换为单个字符串的最快方法。例如,我有:C#:将int[]转换为字符串的最有效方法,c#,arrays,string,optimization,int,C#,Arrays,String,Optimization,Int,我知道这类问题已经回答过很多次了。虽然我已经找到了很多可能的答案,但它们仍然不能解决我的问题,这就是实现将整数数组转换为单个字符串的最快方法。例如,我有: int[] Result = new int[] { 1753387599, 1353678530, 987001 } 我希望它颠倒过来,所以我认为最好在进一步的代码之前加上 Array.Reverse(Result); 虽然我不从末尾进行迭代,但这相当于反转,因为我从末尾调用元素。所以我已经这样做了。只是想让你知道-如果你能想到除我之外
int[] Result = new int[] { 1753387599, 1353678530, 987001 }
我希望它颠倒过来,所以我认为最好在进一步的代码之前加上
Array.Reverse(Result);
虽然我不从末尾进行迭代,但这相当于反转,因为我从末尾调用元素。所以我已经这样做了。只是想让你知道-如果你能想到除我之外的任何其他解决方案,我建议使用这个数组。反向,因为解决方案必须反向。
我总是只关心数字的最后9位,就像模1000000一样。以下是我想要的:
987001|353678530|753387599
现在就把它弄清楚。我编写了自己的函数,比使用.ToString()快50%。
tempint—int数组的当前元素,
StrArray-字符串数组。不值得使用StringBuilder或summing
字符串,因此在最后,我只需将AnswerArr的元素连接起来即可得到结果。
IntBase—一个包含1000个元素的数组,数字的字符串范围为“000”到“999”,索引为0到999
for (i = 0; i < limit; i++)
{
//Some code here
j = 3 * (limit - i);
//Done always
StrArray[j - 1] = IntBase[tempint % 1000];
if (tempint > 999999)
{
//Done in 99/100 cases
StrArray[j - 2] = IntBase[tempint % 1000000 / 1000];
StrArray[j - 3] = IntBase[tempint % 1000000000 / 1000000];
}
else
{
if (tempint > 999)
{
//Done just once
StrArray[j - 2] = IntBase[tempint % 1000 / 1000];
}
}
}
//Some code here
return string.Join(null, StrArray);
(i=0;i
{
//这里有一些代码
j=3*(限值-i);
//总是这样
StrArray[j-1]=IntBase[tempint%1000];
如果(tempint>999999)
{
//在99/100例中完成
StrArray[j-2]=IntBase[tempint%1000000/1000];
StrArray[j-3]=IntBase[tempint%100000000/1000000];
}
其他的
{
如果(tempint>999)
{
//只做一次
StrArray[j-2]=IntBase[tempint%1000/1000];
}
}
}
//这里有一些代码
返回string.Join(null,StrArray);
在这部分之前有很多计算,而且计算速度非常快。所有的时间都是714毫秒,没有整数求和,只有337毫秒
提前感谢您的帮助
致以最良好的祝愿,
伦道夫跑得快吗?最有效?我不确定,你应该试试。但是一个简单的转换方法
int[] Result = new int[] { 1753387599, 1353678530, 987001 };
var newstr = String.Join("|", Result.Reverse().Select(i => i % 1000000000));
对于大多数情况,我建议采用L.B.的答案。但如果你是为了追求最高效率,以下是我的建议:
- 您可以从头开始迭代数组,因此不需要调用任何类型的
Reverse
与IntBase[tempint%1000000/1000]
相同,因为除法的优先级高于模数IntBase[tempint%1000]
- 我敢打赌,整个
中间步骤都会大大降低您的速度IntBase
var sb = new StringBuilder();
var ints; // Your int[]
// Initial step because of the delimiters.
sb.Append((ints[ints.Length - 1] % 1000000000).ToString());
// Starting with 2nd last element all the way to the first one.
for(var i = ints.Length - 2; i >= 0; i--)
{
sb.Append("|");
sb.Append((ints[i] % 1000000000).ToString());
}
var result = sb.ToString();
这不应该是Result.Reverse().Select(i=>(i%100000000.ToString()).ToArray()?速度几乎相同。所以大约1600毫秒。无论如何,我想得到一个字符串,而不是数组。@L.B我指的是第一段中devio的答案:)。我将加粗。请将变量重命名为描述它们的名称。你的代码很难阅读。对不起,这是我在这里的第一篇文章。好的,现在应该清楚了。用适当的固定大小实例化
StringBuilder
,可能会使它更快一点;e、 g.,新的StringBuilder(20)代码>不幸的是,StringBuilder在这里的速度太慢了。谢谢你的回复!是的,我需要最高的效率。1.对不起,我没说清楚,是我的错。虽然我不从末尾进行迭代,但这相当于反转,因为我从末尾调用元素。所以我已经这样做了。我会改正的。2.当然不一样了!也许这确实会减缓一切,但你的建议并不能解决任何问题。而且速度较慢。不幸的是,您的代码不能正常工作,因为它不认为一个数字可以是1.00 0.000 0.1。在这种情况下,它将只显示“1”。所以这是错误的。第二个问题——即使可以,与我的716毫秒相比,需要1231毫秒。正如我在第一条消息中所说,在这里使用StringBuilder是没有效率的。1)反转数组意味着交换元素或生成新数组,在这两种情况下都是O(N)迭代。然后再次迭代,因此在性能方面是不等价的。2) 我想纠正一下,%
确实与部门处于同一优先级组中。