2

この種の質問は、すでに何度も回答されていることを私は知っています。考えられる答えはたくさん見つかりましたが、整数配列を単一の文字列に変換する最速の方法を実装するという私の問題は解決しません。私は例えば:

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 ミリ秒です。

助けてくれてありがとう。

よろしく、ランドルフ

4

2 に答える 2

4

もっと早く?最も効率的ですか?よくわかりません。試してみてください。しかし、変換する簡単な方法

int[] Result = new int[] { 1753387599, 1353678530, 987001 };
var newstr = String.Join("|", Result.Reverse().Select(i => i % 1000000000));
于 2012-11-18T13:02:48.843 に答える
1

ほとんどの場合、LBの答えをお勧めします。しかし、最高の効率を目指して走っているなら、ここに私の提案があります:

  • 配列を最後から繰り返すことができるのでReverse、どんな種類の呼び出しもする必要はありません
  • IntBase[tempint % 1000000 / 1000]IntBase[tempint % 1000]除算はモジュラスよりも優先されるためと同じです
  • 中間ステップ全体IntBaseがあなたを非常に遅くしているに違いない

私の提案はこのようなものになります-LBのコードによく似ていますが、命令型でわずかに最適化されています。

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();
于 2012-11-18T13:12:16.007 に答える