この操作を1回だけ実行する場合、選択肢はそれほど多くありません。モンローの答えによって提供されたコードはうまくいくはずです。
byte[] newValues = new byte[values.Length + 1];
newValues[0] = 0x00; // set the prepended value
Array.Copy(values, 0, newValues, 1, values.Length); // copy the old values
ただし、この操作を複数回実行する場合は、さらにいくつかの選択肢があります。配列にデータを付加することは効率的な操作ではないという根本的な問題があるため、別のデータ構造を使用することを選択できます。
ALinkedList
はデータを効率的に追加できますが、メモリの割り当て/割り当て解除が多くなり、メモリの局所性が失われるため、ほとんどのタスクでは一般的に効率が低くなり、正味の勝利にはならない可能性があります。
両端キュー(dequeと呼ばれる)は、すばらしいデータ構造になります。開始または終了に効率的に追加し、構造内のどこにでも効率的にデータにアクセスできます(ただし、開始または終了以外の場所に効率的に挿入することはできません)。ここでの主な問題は、.NETがdequeの実装を提供しないことです。実装されたサードパーティのライブラリを見つける必要があります。
また、「追加する必要のあるデータ」を追跡し(リスト/キューなどを使用)、実際にデータをできるだけ長く追加するのを待つことで、コピー時に大幅に節約できるため、作成を最小限に抑えることができます。可能な限り新しい配列の数を増やし、既存の要素のコピー数を制限します。
また、構造を調整して、最初ではなく最後に追加するようにすることもできます(後で逆にする必要があることがわかっている場合でも)。短時間で大量に追加する場合は、データをに保存してList
(効率的に最後に追加できます)、最後に追加する価値があるかもしれません。必要に応じて、リストのラッパーであり、逆になっているという事実を隠すクラスを作成する価値がある場合もあります。内部が実際にデータを後方に保持している場合でも、データが正常に格納されているかのように、外部から表示されるように、などにマップi
するインデクサーを作成できます。Count-i
List