C#での長さが不明な配列


81

私はC#の学習を始めたばかりで、配列の概要で変数を配列として確立する方法を示しましたが、割り当て時に配列の長さを指定する必要があるようです。そのため、長さがわからない場合はどうなりますか。アレイ?

回答:


115

配列には長さを割り当てる必要があります。任意の数の要素を許可するには、Listクラスを使用します。

例えば:

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3

3
List<int[]> myInts = new List<int[]>();動作する可能性があります。
ニコラスタイラー

1
配列に長さを割り当てる必要がある場合、なぜこれを行うことができますか?String [] arr = "test; the; values; now" .Split( ';'); そしてそれは長さを決定するだけですか?それでも、同じコード行を取得して、変数宣言を別の行に移動することはできません。
matthew_360 2015

@ matthew_360 split関数内で、配列は実際には固定サイズで呼び出されています。例:referencesource.microsoft.com/#mscorlib/system/...
ハッチ

あなたの応答に関して"Arrays must be assigned a length"-のstatic外のメソッドでMain()、私は宣言を行い、String[] tokens = nullそれを初期化しませんでしたが"Hello.World".Split('.')System.NullReferenceExceptionなぜエラーを取得せずにそれを呼び出すことができたのですか?
ミントラン2017年

40

List<>不明な長さの「配列」を構築するために使用します。

List<>.ToArray()ではなく、実際の配列を返すために使用しListます。

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();

私にとって、リストは不明なサイズの問題を解決し、次に.ToArray()が必要な配列を作成しました。
dev1998 2015年

2
System.Collections.Genericを使用する;
PodTech.io 2017

20

少し背景情報:

前述のように、動的なコレクションが必要な場合は、を使用しList<T>ます。内部的には、リストはストレージにも配列を使用します。その配列は、他の配列と同じように固定サイズです。配列がサイズを持っていると宣言されると、それは変更されません。にアイテムを追加すると、そのアイテムListは配列に追加されます。最初Listは、長さが16であると私が信じる配列から始まります。17番目の項目をに追加しようとするListと、新しい配列が割り当てられます。これは、(私が思うに)古い配列の2倍のサイズです。 、だから32アイテム。次に、古い配列の内容が新しい配列にコピーされます。したがってList、外部のオブザーバーには動的に見えるかもしれませんが、内部的にはルールにも準拠する必要があります。

ご想像のとおり、配列のコピーと割り当ては無料ではないためList、配列の初期サイズを(のコンストラクターで)指定できるように、配列をできるだけ少なくすることを目指してください。完璧なシナリオでは、必要なものすべてを保持するのに十分な大きさです。ただし、これはマイクロ最適化であり、問​​題になる可能性はほとんどありませんが、実際に何をしているのかを知ることは常に素晴らしいことです。


1
これはまさに私が求めていた情報です。他のほとんどの回答よりもはるかに有益な情報を見つけてください。+1
キャリーケンダル2015年

16

サイズを変数に設定して配列を作成できます。

int size = 50;
string[] words = new string[size]; // contains 50 strings

ただし、100語が必要な場合は、後でそのサイズを変更することはできません。サイズを本当に動的にする必要がある場合は、別の種類のデータ構造を使用する必要があります。試してみてくださいList


これらはすべてnullです。string[] words = new string(',', size - 1).Split(',');今すぐお試しください。で初期化され""ます。
ビターブルー2014年

3

使用しArrayListた.NET 1.xであれば、またはList<yourtype>.NET 2.0または3.xであれば

でそれらを検索するSystem.CollectionsSystem.Collections.Generics


2

データが一意である場合は、辞書を調べることもできます。これにより、2つの列を操作できるようになります。

ユーザー名、合計請求額

値だけを検索および更新するための多くの組み込みツールを提供します。


1
var yummy = new List<string>();
while(person.FeelsHappy()) {
    yummy.Add(person.GetNewFavoriteFood());
}
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count);
Console.WriteLine("I didn't even need to know how big to make it " +
    "until I finished making it!");


1

一言で言えば、コレクションとジェネリックを使用してください。

これはC#開発者にとって必須であり、学ぶのに時間を費やす価値があります:)


1

上で詳述したように、一般的なリスト<>はそれを行うための最良の方法です。

.NET 1. *で立ち往生している場合は、代わりにArrayListクラスを使用する必要があります。これにはコンパイル時の型チェックがなく、キャストも追加する必要があります-面倒です。

後続のバージョンでは、スレッドセーフなバリアントを含むさまざまなバリエーションも実装されています。


1

リストの代わりに配列を本当に使用する必要がある場合は、次のように実行時にサイズが計算される配列を作成できます...

たとえば、サイズn xnの2次元配列が必要です。nは実行時にユーザーから取得されます

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];

同様に、1次元配列の場合、次のように記述します。varx = new int [n];
ケン・ヤンカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.