创建具有任意数量的同一对象实例的列表的最佳方法是什么?即是否有更紧凑或更有效的方法来执行以下操作?
static List<MyObj> MyObjs = Enumerable.Range(0, 100)
.Select(i => new MyObj())
.ToList();
(Enumerable.Repeat
会给我十个对同一个对象的引用,所以我认为它不会起作用。)
编辑以反映此方法不起作用。
我很好奇你对 的评论Enumerable.Repeat
,所以我试了一下。
//do not use!
List<object> myList = Enumerable.Repeat(new object(), 100).ToList();
我确认他们确实像提到的 OP 一样共享相同的参考。
这并不难实现为迭代器:
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());
}
}
}
您可以使用可枚举作为基础并使用 select 创建新对象:
List<object> myList = Enumerable.Repeat(null, 100).Select(_ => new object()).ToList();
您可以附加一个调试器,new
每次都会执行。这与您的代码几乎相同,但您不必提供虚假范围。你只提供一个null
你想重复的假对象......