4

C#にchar配列があります。

var arr = new char[3] { 'a','b','c' };

新しい配列を作成せずに、末尾にスペースを追加するにはどうすればよいですか?

結果:arr = { 'a', 'b', 'c', ' ', ' ', ' ' };

これは、VB.NETのに似ているように聞こえるかもしれませんReDim。しかし、それが私が望んでいることでもありません。その中の要素を保持し、舞台裏で新しい配列をインスタンス化したくない。

これはジェネリックコレクションとArrayListでのみ可能ですか?

ありがとう

4

2 に答える 2

8

残念ながら、配列は設計上事前に固定されています。これは、ヒープに必要な量のメモリを確保するため重要です。

したがって、新しいものを作成しないという要件に答えるには、不可能です。

ただし、回避策があります。次の方法を見てください。

Array.Resize(ref myArr, myArr.Length + 5);

ソースで説明されているように動作します:

このメソッドは、指定されたサイズで新しい配列を割り当て、古い配列の要素を新しい配列にコピーしてから、古い配列を新しい配列に置き換えます。

配列が null の場合、このメソッドは指定されたサイズで新しい配列を作成します。

newSize が古い配列の長さより大きい場合、新しい配列が割り当てられ、すべての要素が古い配列から新しい配列にコピーされます。newSize が古い配列の長さよりも小さい場合、新しい配列が割り当てられ、新しい配列がいっぱいになるまで要素が古い配列から新しい配列にコピーされます。古い配列の残りの要素は無視されます。newSize が古い配列の長さと等しい場合、このメソッドは何もしません。

このメソッドは O(n) 操作です。n は newSize です。

これはmyArr、新しい配列を参照するように更新されることを意味します。ただし、元の配列への別の参照がある場合、これは更新されません (古いバージョンを参照し続けます)。

出典: MSDN

于 2012-08-15T20:41:20.853 に答える
8

いいえ、これはジェネリックまたはその他の配列を使用して行うことはできません..私の知る限り、配列のサイズを動的に変更する方法はありません。代わりにリストを使用してください。

Martin がコメントで指摘したように、Listクラスでさえ内部実装で配列を使用します。データ構造を再初期化せずに動的にサイズ変更できるようにしたい場合は、独自のバージョンの連結リストを実装する必要があります。

System.Collections.Generic二重にリンクされたリストを表すLinkedListというクラスが含まれています (つまり、各ノードは次のノードと前のノードの両方への参照を持っています) が、その内部実装が配列を使用しているかどうかはわかりません..

于 2012-08-15T20:43:26.557 に答える