多次在字符串中添加字符串

时间:2013-10-31 12:49:10

标签: c# .net string

我有一串十六进制数字,比如说

"010104000202000AC80627061202"

我希望输出为

"01 01 04 00 02 02 00 0A C8 06 27 06 12 02"

我可以使用for循环,但是有没有优化的方法?

我目前正在做的是:

int length = line.Length/2; // Store the length of String
string outputstr = String.Empty;
for (int count = 0; count < length; count++)
  {
       outputstr += line.Substring(0, 2) + " "; //Get First two bytes and add space
       line = line.Substring(2); // Remove those two bytes
 }

7 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

string outputstr = Regex.Replace(inputstr, ".{2}", "$0 ");

答案 1 :(得分:2)

这看起来很简单但也很有效。

private static string DoThat(string input)
{
    var sb = new StringBuilder(input.Length);
    for (int i = 0; i < input.Length; i += 2)
    {
        sb.Append(input, i, 2);
        sb.Append(" ");
    }
    return sb.ToString();
}

答案 2 :(得分:1)

因为输出字符串的长度是事先已知的,所以最快的方法是分配最终大小的char[],填充它然后return new string(myCharBuffer);。这也总是被称赞StringBuilder更快。只需要两个分配,两个分配都具有完美的大小,第二个分配由memcpy填充。

答案 3 :(得分:1)

如果您希望更快,您可以更改为stringbuilder:

int length = line.Length; // Store the length of String -- see edit below
StringBuilder output = new StringBuilder();
for (int count = 0; count < length; count += 2)  // makes more sense to increment the loop by 2
{
    output.Append(line.Substring(count, 2) + " "); //Get First two bytes and add space
}

使用Linq进行此操作的一种方法是

string.Join(" ",                      // join the string collection created below
    line.Select((c,i) => new {c,i})   // get each character and its index
        .GroupBy(g => g.i/2)          // group in pairs
        .Select(g => new string(g.Select(ci => ci.c).ToArray()))  // convert to char arrays and merge into strings
     );

或者

string.Join(" ",
Enumerable
    .Range(0, s.Length/2)
    .Select(i => s.Substring(i*2, 2))
 )

虽然这实质上是在“循环”中调用Substring所以它可能不是最有效的方法。

答案 4 :(得分:1)

首先,如果要循环并使用字符串操作,请使用Stringbuilder。

这是因为String是不可变的,虽然看起来好像在改变它,但实际上每次迭代都会创建一个新对象并保存在堆栈中。

答案 5 :(得分:1)

如果字符串很大,您可以使用StringBuilder

if(line.Length > 100)
{
    StringBuilder sb = new StringBuilder(line.Length + line.Length/2);
    for(int i=0; i < line.Length; i++)
    {
        sb.Append(line[i]);
        if (i % 2 == 1 && i < line.Length-1)
            sb.Append(' ');
    }
    return sb.ToString();
}
// else your approach

答案 6 :(得分:0)

你可以这样:

var unformatedString = "010104000202000AC80627061202";
var formatedString = Regex.Replace(@"..", "$0 ");

这绝对不是更快,但更容易阅读。