web-dev-qa-db-ja.com

配列C#の最後に追加する方法は?

クラスを参照するitemの最後に、WindowsフォームのTextBoxとButtonから新しいArrayListを追加するにはどうすればよいですか?

_private product[] value = new product[4];

value[1] = new product("One",5)
value[2] = new product("Two",3)
value[3] = new product("Three",8)
_

ワークフロー

  • 新製品の詳細を_textbox1_、_textbox2_、_textbox3_に入力します
  • Addをクリックすると、新しい製品が配列に追加されます。

    value[1] = new product("One",5)
    value[2] = new product("Two",3)
    value[3] = new product("Three",8)
    value[4] = new product("Four",2)

これを行うためのコードは何ですか?

14
Timmy

配列は固定サイズです。つまり、作成時に割り当てられた数より多くの要素を追加することはできません。自動サイズ設定コレクションが必要な場合は、List<T>またはArrayListを使用できます。

例:

// using collection initializers to add two products at creation time
List<Product> products = new List<Product>{new Product("One",5), new Product("Two",3) };

// then add more elements as needed
products.Add(new Product("Three",8));
28
Pop Catalin

他の人が言及したようにリストを使用してください。アレイに設定されている場合は、

Array.Resize<Product>(ref product, your new size);

(アレイの存続期間中に)いくつかの製品を追加するだけの場合は、次のようにします。

Array.Resize<Product>(ref product, product.Length + 1);

多くの製品を追加する場合は、Listと同様のことを行うことをお勧めします-次のようになります。

Array.Resize<Product>(ref product, product.Length * 2);
16
s_hewitt

コードを見て、_List<product>_コレクションが必要だと思います。次に、その上でAdd()メソッドを呼び出すだけです。

3
Russ Cam

配列にアイテムを追加することはできません。より大きな新しい配列を作成して、アイテムをその配列にコピーする必要があります。そのための方法がありますが、実際には配列のサイズを変更しないため、誤解を招くような名前がResizeになります。

Array.Resize<product>(ref value, 5);

コレクションにアイテムを追加する場合は、代わりにリストを使用する必要があります。

private List<product> value = new List<product>();
value.Add(new product("One",5));
value.Add(new product("Two",3));
value.Add(new product("Three",8));

value.Add(new product("Four",2));

編集:
配列のサイズを変更する場合は、特定の値にサイズ変更するのではなく、サイズを大きくすることをお勧めします。

int index = value.Length;
Array.Resize<product>(ref value, index + 1);
value[index] = ...
2
Guffa

配列のインデックスはゼロであるため、サイズ4に初期化された配列には、インデックス3までしかアクセスできませんでした。

配列を拡張したい場合は、少なくとも拡張できる大きさの配列を初期化するか、新しい大きなサイズで新しい配列を作成してコピーする必要があります。古い配列が終わりました。あまり効率的ではありません。

この場合、サイズを動的に増やすことができるように、配列ではなくリストのようなコレクションを使用することをお勧めします。

1
John Weldon

おそらく、 配列とリスト:どちらをいつ使用するか? も確認する必要があります。

0
Sune Rievers

Array.Resizeは効率的な方法ではありません。新しいサイズで新しい配列を作成し、古い配列値を新しい配列にコピーしてから、古い配列を新しい配列に置き換えます。ご覧のとおり、これはアイテムを追加する非常に効率的な方法ではありません。

配列の代わりにリストを使用するか、最初から予想される最大の次元で配列を作成するかを制御できないという要件がない限り。

詳細については、次の例を検討してください。100万個のアイテムを保持し、オブジェクトで埋めることができる配列を作成しました。百万と1つのオブジェクトを配列に追加したいとします。 Array.Resizeメソッドを使用して、配列サイズを1000001に変更します。メソッドが1000001アイテムの新しい配列を作成し、アイテムを古い配列から新しい配列にコピーしようとすると、2つしようとしているため、メモリ不足エラーが発生する場合があります。必要なすべてのアイテムが100万+1である間、同時にメモリ内の100万の配列(200万のオブジェクトを保持)。ただし、作成、コピー、および置換で失われる時間とリソースを考慮してください。

0
Mohamed Eissa