用同一對象的任意數量的實例創建列表的最佳方式是什麼?即是否有更緊湊或有效的方法來做到以下幾點?創建充滿對象的新實例的列表
static List<MyObj> MyObjs = Enumerable.Range(0, 100)
.Select(i => new MyObj())
.ToList();
(Enumerable.Repeat
會給我十所引用同一個對象,所以我不認爲這是可行的。)
用同一對象的任意數量的實例創建列表的最佳方式是什麼?即是否有更緊湊或有效的方法來做到以下幾點?創建充滿對象的新實例的列表
static List<MyObj> MyObjs = Enumerable.Range(0, 100)
.Select(i => new MyObj())
.ToList();
(Enumerable.Repeat
會給我十所引用同一個對象,所以我不認爲這是可行的。)
這並不難實現,因爲一個迭代器:
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();
}
}
顯然,答案是「否」。感謝大家!
不確定在這種情況下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());
}
}
}
使用'ToList'使用'List(IEnumerable
.Select方法必須創建一個新的Enumeration,因爲該類型已從int更改爲MyObj。它還必須調用匿名方法100次,最後將其全部轉換爲列表
http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx範圍和選擇使用'yield return'。因爲執行延遲到調用ToList的時候,結果只能枚舉一次,這在構建列表時會發生。 – cadrell0
我看不出有任何問題與您當前的做法... – Brian
我不是說有一個問題..它只是感覺像一個黑客。 – Arithmomaniac
「它只是感覺像一個黑客。」爲什麼,根本不是!這就是一個'for'循環的手下來:-) – dasblinkenlight