2014年6月20日金曜日

コレクションの初期化 Repeat or Range

参照型のコレクションを、インスタンス込みで初期化したい時がある。

なんか動きがおかしいので、デバッグしていたら、以下の様なことがわかった。

    int numOfFoo = 3;

    // newが1回だけ実行され、その結果が3回使われる。
    // コレクションの要素数は3だが、全て同じインスタンスが入っている。
    var listX = Enumerable.Repeat(new Foo(), numOfFoo).ToList();

    // newが3回実行される。
    // コレクションの要素数は3で、別々のインスタンスが入っている。
    var listO = Enumerable.Range(0, numOfFoo).Select((x) => new Foo()).ToList();

配列の初期化にRepeatを使っていたので、同じように書いたらダメダメだった。
気をつけよう。

0 件のコメント:

コメントを投稿