2013-07-25 7 views
11

同じオブジェクトの任意の数のインスタンスを持つリストを作成する最良の方法は何ですか?すなわち、次のことを行うよりコンパクトで効率的な方法がありますか? オブジェクトの新しいインスタンスでいっぱいのリストを作成する

static List<MyObj> MyObjs = Enumerable.Range(0, 100) 
    .Select(i => new MyObj()) 
    .ToList(); 

Enumerable.Repeatは私に同じオブジェクトへの参照10を与えるだろうので、私はそれがうまくいくとは思わない。)

+7

私はあなたの現在のアプローチですべての問題を見ていない... – Brian

+0

私は問題がありますとは言いませんよ。..それはちょうどハックのように感じる。 – Arithmomaniac

+2

"それはちょうどハックのように感じる。なぜ、全く!これは 'for'ループを打ち負かす:-) – dasblinkenlight

答えて

8

これはイテレータとして実装するのは難しいことではないでしょう。

IEnumerable<T> CreateItems<T> (int count) where T : new() { 
    return CreateItems(count,() => new T()); 
} 

IEnumerable<T> CreateItems<T> (int count, Func<T> creator) { 
    for (int i = 0; i < count; i++) { 
     yield return creator(); 
    } 
} 
3

どうやら、答えは「ノー」です。みんな、ありがとう!

6

ではありません。

Enumerable.Repeatについてのあなたのご意見には興味がありましたので、試しました。

List<object> myList = Enumerable.Repeat(new object(), 100).ToList(); 

私は、それらがすべて、OPのように同じ参照を共有していることを確認しました。

+2

'myList [i] = ...'を実行するとインスタンスを上書きしています。プロパティBarでFooクラスを作成し、Barを変更すると、それはすべてのインデックスで変わることがわかります。 – cadrell0

+0

@ cadrell0ご意見ありがとうございます。あなたは正しい - 私は自分自身をそこから投げ捨てた。私はここで私の答えを、他人のために何もしないことの教訓として残しておきます。 – Gray

2

この場合、forループの何が問題なのかよくわかりません。最低でも、リストの容量を知ることができます。これは100個のオブジェクトでは重要ではないかもしれませんが、サイズは任意です。

public class MyClass 
{ 
    static int Capacity = 100; 
    static List<MyObj> MyObjs = new List<MyObj>(Capacity); 

    static MyClass() { 
     for(var i = 0; i < Capacity; i++) { 
      MyObjs.Add(new MyObj()); 
     } 
    } 
} 
+1

'ToList'を使うと' List 'の' List(IEnumerable items) 'コンストラクタが使用されます。これは各項目に対して' Add'を呼び出すよりも少し速いと思います。それは少なくとも同じである。 'Range'は内部的に' for'ループを使います。あなたのソリューションは、性能は同じですが、コードは最高です。 – cadrell0

+0

.Selectメソッドは、型がintからMyObjに変更されたため、必ず新しい列挙型を作成する必要があります。また、匿名メソッドを100回呼び出す必要があり、最後にこれをすべてリストに変換する必要があります。 – B2K

+1

http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx RangeとSelectの両方が 'yield return'を使用します。 'ToList'が呼び出された時点で実行が延期されるため、結果はリストの構築中に一度だけ列挙されます。 – cadrell0

関連する問題