0

私はこのコードを持っています:

List<string> list = new List<string>(30);

list.Insert(1, "string 1");
list.Insert(10, "string 10");
list.Insert(5, "string 5");

文字列 10 でランタイムがクラッシュし、インデックスはリストの境界内にある必要がありますという例外が発生します

私が理解できないのは、30 項目のリストを定義したということです。なぜこれがクラッシュするのでしょうか?また、そのような方法で項目を追加できない場合、30 項目を定義する意味は何ですか?

4

5 に答える 5

5

初期化されたとき、リストはまだ空です。パラメータ '30' は、単純に 30 項目の容量を持つことを意味します。

どうしても配列の代わりにリストを使用する場合は、最初に 30 個の項目を追加してから、適切なインデックスを設定する必要があります。

これを行う最も簡単な方法は次のとおりです。

List<string> list = new string[30].ToList();

list[1] = "string 1";
list[10] = "string 10";
list[5] = "string 5";

また、 を使用している場合はInsert、基本的Addにアイテムが特定のインデックスになるため、リスト内のアイテムの数が増えることに注意してください。

于 2012-05-12T20:29:03.107 に答える
3

この行:

List<string> list = new List<string>(30);

を 30 項目list容量に初期化します。30個のアイテムを作成しません。

この時点でリストは空です。最初に30 個のアイテムを追加する必要があります。その後、ランダムにすることができますが、ivowibloの回答Insertで説明されているように、これらのアイテムをランダムな順序で並べ替えることができます。

(LINQ を使用して) 30 項目のリストを初期化する方法については、Yorye Nathanによる回答を参照してください。

于 2012-05-12T20:26:18.067 に答える
0

ここを見てください。ご覧のとおり、insert メソッドは、リストのcount変数ではなく、capacityを使用します。これは、要素の有効数であるリストの現在の数までの位置に要素を挿入できることを意味します。

于 2012-05-12T20:29:17.090 に答える
0

30 個の要素用にメモリを予約しましたが、実際には最初の insertの前にリストが空であるため、1 つの要素を挿入した後、リストに位置 10 がありません。

于 2012-05-12T20:29:35.953 に答える
0

これはトリックを行います:

List<string> list = new List<string>();

list.Add("string 1");
list.Add("string 10");
list.Add("string 5");
var randomOrder = list.OrderBy(x => Guid.NewGuid());
于 2012-05-12T20:31:00.973 に答える