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
    中间步骤都会大大降低您的速度
我的建议是这样的——很像L.B.的代码,但它是强制性的,并且略微优化了

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) 我想纠正一下,
%
确实与部门处于同一优先级组中。