私はC#の学習を始めたばかりで、配列の概要で変数を配列として確立する方法を示しましたが、割り当て時に配列の長さを指定する必要があるようです。そのため、長さがわからない場合はどうなりますか。アレイ?
回答:
配列には長さを割り当てる必要があります。任意の数の要素を許可するには、List
クラスを使用します。
例えば:
List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3
"Arrays must be assigned a length"
-のstatic
外のメソッドでMain()
、私は宣言を行い、String[] tokens = null
それを初期化しませんでしたが"Hello.World".Split('.')
、System.NullReferenceException
なぜエラーを取得せずにそれを呼び出すことができたのですか?
List<>
不明な長さの「配列」を構築するために使用します。
List<>.ToArray()
ではなく、実際の配列を返すために使用しList
ます。
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
少し背景情報:
前述のように、動的なコレクションが必要な場合は、を使用しList<T>
ます。内部的には、リストはストレージにも配列を使用します。その配列は、他の配列と同じように固定サイズです。配列がサイズを持っていると宣言されると、それは変更されません。にアイテムを追加すると、そのアイテムList
は配列に追加されます。最初List
は、長さが16であると私が信じる配列から始まります。17番目の項目をに追加しようとするList
と、新しい配列が割り当てられます。これは、(私が思うに)古い配列の2倍のサイズです。 、だから32アイテム。次に、古い配列の内容が新しい配列にコピーされます。したがってList
、外部のオブザーバーには動的に見えるかもしれませんが、内部的にはルールにも準拠する必要があります。
ご想像のとおり、配列のコピーと割り当ては無料ではないためList
、配列の初期サイズを(のコンストラクターで)指定できるように、配列をできるだけ少なくすることを目指してください。完璧なシナリオでは、必要なものすべてを保持するのに十分な大きさです。ただし、これはマイクロ最適化であり、問題になる可能性はほとんどありませんが、実際に何をしているのかを知ることは常に素晴らしいことです。
サイズを変数に設定して配列を作成できます。
int size = 50;
string[] words = new string[size]; // contains 50 strings
ただし、100語が必要な場合は、後でそのサイズを変更することはできません。サイズを本当に動的にする必要がある場合は、別の種類のデータ構造を使用する必要があります。試してみてくださいList
。
string[] words = new string(',', size - 1).Split(',');
今すぐお試しください。で初期化され""
ます。
List<int[]> myInts = new List<int[]>();
動作する可能性があります。