2

私が次のことをした場合:

List<GenericClass> listObj = new List<GenericClass>(100);

// Do I need this part too?
for (int i = 0; i < 100; i++)
{
    listObj[i] = new GenericClass();
}

基本的に、リスト内の 100 個の GenericClass オブジェクトのそれぞれに対して、C# コンパイラが GenericClass コンストラクターを自動的に起動するかどうかを尋ねています。MSDN のドキュメントだけでなく、StackOverflow も検索しました。

助けてくれてありがとう。

4

4 に答える 4

3

それはどのようにList機能するかではありません。容量を指定する場合、それはリスト内のアイテムの数ではなく、初期容量です。メソッドを使用して追加するまで、リストには要素が含まれていませんAdd。リストには最大容量がありません。Add メソッドを使用してオブジェクトを追加しているため、最初にオブジェクトを新しくする必要があります。

実際、質問に入力したことを実行すると、ArgumentOutOfRange例外がスローされます。

あなたがしていることのために、配列を使用する必要があります。

var listObj = new List<GenericClass>();
listObj[0] = new GenericClass(); // ArgumentOutOfRange exception

これはうまくいきます:

for (int i=0;i<100;i++)
{
    listObj.Add(new GenericClass());
}

これはあなたがやろうとしていたことです:

var arrayObj = new GenericClass[100];
for (int i = 0; i < 100; i++)
{
    arrayObj[i] = new GenericClass();                
}
于 2012-02-05T06:54:30.533 に答える
1

はい、各インスタンスを作成してリストに追加する必要があります。このコンストラクタ スタイルの備考セクションを見てください: http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx

新しい GenericClass インスタンスをリストに追加するたびにバックグラウンドでリストのサイズを変更する必要がないように、リストに配置する要素の数を指定しています。

于 2012-02-05T06:55:19.287 に答える
0

Listで直接実行することはできないため、ヘルパーメソッドを使用してジェネレーターを作成し、List(IEnumerableコレクション)オーバーロードを使用できます。

   class Program
    {
        static void Main(string[] args)
        {
            var list = new List<string>
            (
                Generator.New(() => new string('a', 5), 100)
            );

            list.ForEach((x) => Console.WriteLine(x));
        }
    }

    public static class Generator
    {
        public static IEnumerable<T> New<T>(Func<T> generator, int nCount)
        {
            for (int i = 0; i < nCount; i++)
            {
                yield return generator();
            }
        }

        public static IEnumerable<T> New<T>(Func<int,T> generator, int nCount)
        {
            for (int i = 0; i < nCount; i++)
            {
                yield return generator(i);
            }
        }
    }

これは機能しますが、Listがこの機能をすぐにサポートする場合ほどきれいではありません。サンプルプログラムは、5文字で構成される100行を印刷します。

于 2012-02-05T07:27:53.497 に答える
0

いいえ!初期容量を指定します。

MSDN の記事:

リストの容量は、リストが保持できる要素の数です。要素が List に追加されると、内部配列を再割り当てすることにより、必要に応じて容量が自動的に増加します。

于 2012-02-05T06:55:00.067 に答える