1

たとえば、16進数の文字列があります

"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
 }
4

7 に答える 7

4

次の正規表現を使用できます。

string outputstr = Regex.Replace(inputstr, ".{2}", "$0 ");
于 2013-10-31T12:54:13.883 に答える
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();
}
于 2013-10-31T13:08:28.887 に答える
1

StringBuilder文字列が大きい場合は、a を使用できます。

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
于 2013-10-31T12:56:17.737 に答える
1

出力文字列の長さは事前にわかっているため、最速の方法はchar[]、最終的なサイズの を割り当て、それを埋めてからreturn new string(myCharBuffer);. これもいつも絶賛の速さStringBuilder。必要な割り当ては 2 つだけで、どちらも完璧なサイズで、2 番目の割り当てはmemcpy.

于 2013-10-31T12:53:47.493 に答える
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 を使用してそれを行う 1 つの方法は、

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ため、最も効率的な方法ではない可能性があります。

于 2013-10-31T12:53:59.040 に答える
1

まず、ループして文字列操作を使用する場合は、Stringbuilder を使用します。

これは、String が不変であるためです。変更しているように見えるかもしれませんが、実際には反復ごとに新しいオブジェクトが作成され、スタックに保持されます。

于 2013-10-31T12:54:41.463 に答える
0

次のようなことができます。

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

これは間違いなく高速ではありませんが、読みやすくなっています。

于 2013-10-31T12:55:55.500 に答える