【问题标题】:C#: the most efficient way to convert int[] into a stringC#:将 int[] 转换为字符串的最有效方法
【发布时间】:2012-11-06 13:54:15
【问题描述】:

我知道这类问题已经回答过很多次了。虽然我找到了很多可能的答案,但它们仍然没有解决我的问题,即实现将整数数组转换为单个字符串的最快方法。例如:

int[] Result = new int[] { 1753387599, 1353678530, 987001 }

我希望它颠倒过来,所以我认为最好在进一步的代码之前加上

Array.Reverse(Result);

虽然我不从末尾迭代,但相当于倒车,因为我从末尾调用元素。所以我已经这样做了。只是让您知道 - 如果您能想到除我之外的任何其他解决方案,我建议使用此 Array.Reverse,因为解决方案必须颠倒。 我总是只关心数字的最后 9 位数字——比如模 1 000 000 000。这就是我想要得到的:

987001|353678530|753387599

分隔符只是为了现在清楚。我编写了自己的函数,它比使用 .ToString() 快 50%。 tempint - int 数组的当前元素, StrArray - 一个字符串数组。不值得使用 StringBuilder 或求和 字符串,所以最后我只需加入 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);

在这部分之前有很多计算,它们完成得非常快。虽然一切都在 714 毫秒内完成,但没有对整数求和,它只有 337 毫秒。

提前感谢您的帮助。

最好的问候, 伦道夫

【问题讨论】:

  • 在第一段。我会加粗的。
  • 请将您的变量重命名为描述它们的名称。您的代码难以阅读。
  • 抱歉,这是我在这里的第一篇文章。好的,现在应该清楚了。

标签: c# arrays string optimization int


【解决方案1】:

更快?最有效?我不确定,你应该试试。但是一个简单的转换方法

int[] Result = new int[] { 1753387599, 1353678530, 987001 };
var newstr = String.Join("|", Result.Reverse().Select(i => i % 1000000000));

【讨论】:

  • 不应该是 Result.Reverse().Select(i => (i % 1000000000).ToString()).ToArray() 吗?
  • 速度几乎相同。所以大约1600毫秒。无论如何,我想得到一个字符串,而不是一个数组。
  • @L.B 我指的是 devio 的回答 :)
【解决方案2】:

对于大多数情况,我会建议 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();

【讨论】:

  • 用适当的固定大小实例化StringBuilder,可能会使其更快一点;例如,new StringBuilder(20);
  • 不幸的是,这里使用 StringBuilder 的任何东西都太慢了。
  • 感谢您的回复!是的,我确实需要最高效率。 1.对不起,我没有说清楚,我的错。虽然我不是从尾部开始迭代,但是相当于倒车,因为我是从尾部调用元素的。所以我已经这样做了。我会纠正这个。 2.当然不一样!
  • 也许它确实减慢了一切,但你的建议并不能解决任何问题。而且速度较慢。不幸的是,您的代码不能正常工作,因为它不认为一个数字可以是 1.000.000.001,例如。在这种情况下,它只会显示“1”。所以这是错误的。第二个问题——即使没问题,它也花了 1231 毫秒,而我的 716 毫秒。正如我在第一条消息中所说,这里使用 StringBuilder 效率不高。
  • 1) 反转数组意味着交换元素或生成新数组,在这两种情况下都是 O(N) 迭代。然后你在迭代再次,所以它在性能方面并不等同。 2) 我的立场是正确的,% 确实与部门在同一优先级组中。
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2012-07-26
  • 2021-07-16
  • 2017-12-30
相关资源
最近更新 更多