2013-07-25 40 views
11

用同一對象的任意數量的實例創建列表的最佳方式是什麼?即是否有更緊湊或有效的方法來做到以下幾點?創建充滿對象的新實例的列表

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

Enumerable.Repeat會給我十所引用同一個對象,所以我不認爲這是可行的。)

+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(); 
    } 
} 
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(IEnumerable items)'List '的構造函數',我相信這比每個項目調用'Add'快一點。這至少是一樣的。 'Range'在內部使用'for'循環。您的解決方案充其量只有相同的性能,但代碼更多。 – cadrell0

+0

.Select方法必須創建一個新的Enumeration,因爲該類型已從int更改爲MyObj。它還必須調用匿名方法100次,最後將其全部轉換爲列表。 – B2K

+1

http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx範圍和選擇使用'yield return'。因爲執行延遲到調用ToList的時候,結果只能枚舉一次,這在構建列表時會發生。 – cadrell0