0

定期的に新しいアイテムが追加されるオブジェクト配列を実装したいアプリを書いています。

最後に追加されたオブジェクトがどれで、そのオブジェクトを位置 0 に配置することを検討していたかを常に知りたい (したがって、各アイテムを 1 インデックス下に最大 130 アイテムにプッシュする)

これは、リストを使用して実装するのはかなり簡単です

items.Insert(0,new item());
items.RemoveAt(130);

これにより、各アイテムが自動的に押し下げられ、130 でアイテムが削除されますが、これは配列ではそれほど単純ではありません

の線に沿ったどこかで私の最初の考え

for(int i = 129; i>0;i--)
{
 items[i] = items[i-1]; 
}
items[0] = new item();

これにより、最新のアイテム (インデックス [0] を介して) に簡単にアクセスでき、前の各アイテムは作成順 (1 -> 129) にアクセスできます。

これ自体はかなり単純ですが、これを実行する他の方法があるかどうか疑問に思っていました。

編集:迅速な返信をありがとう、

私はこれについていくつかのテストを実行しました(100万回の反復を使用)。ここではキューメソッドが最も速いように見えますが、100万アイテムを処理するのに50%長くかかったリストよりもわずかに長いだけです

キュースタック オプションを調べてみようと思います

再度、感謝します;

4

3 に答える 3

5

最後に追加されたオブジェクトがどれで、そのオブジェクトを位置 0 に配置することを検討していたのかを常に知りたいと 思っています

ただし、これを実行する他の方法があれば。

はい、キュー(First Input First Output) である既に構築された構造を使用して、これを実行する簡単な方法があります。主に次の 3 つの方法が必要です。

  • Enqueue()キューの最後にオブジェクトを追加します。

  • Dequeue()は、キュー の先頭にあるオブジェクトを返し、それを削除します。

  • Peek()削除せずにキュー の先頭にあるオブジェクトを返します。

于 2012-12-31T01:03:35.253 に答える
0

ループは不要です。Array.Insertは要素を「シフトダウン」します。

ただし、本当に最初に常に新しい要素を追加したい場合は、要素を挿入する場所に関係なく要素をシフトする必要がないため、パフォーマンス上の理由からLinkedListの方が適しています。

于 2012-12-31T01:01:48.000 に答える
-1

それはあなたがそれを作ることができるのと同じくらい簡単だと思います。個人的には、一般的な拡張メソッドにします。

public static void Insert<T>(this T[] array, int position, T item)
{
    for ( int i = array.Length-1; i > position; i-- )
        array[i] = array[i-1];

    array[position] = item;
}

だからあなたはそれを次のように使うことができます

string[] lolCats = { "ceiling cat", "invisible bike cat", "lime cat" };

lolCats.Insert(0, "monorailcat");
于 2012-12-31T01:05:06.920 に答える