19

创建具有任意数量的同一对象实例的列表的最佳方法是什么?即是否有更紧凑或更有效的方法来执行以下操作?

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

Enumerable.Repeat会给我十个对同一个对象的引用,所以我认为它不会起作用。)

4

5 回答 5

9

编辑以反映此方法不起作用

我很好奇你对 的评论Enumerable.Repeat,所以我试了一下。

//do not use!
List<object> myList = Enumerable.Repeat(new object(), 100).ToList();

我确认他们确实像提到的 OP 一样共享相同的参考。

于 2013-07-25T18:02:36.910 回答
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();
    }
}
于 2015-05-19T00:53:36.570 回答
4

显然,答案是“不”。感谢大家!

于 2013-07-25T17:59:56.030 回答
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());
       }
    }
}
于 2013-07-25T18:04:39.940 回答
0

您可以使用可枚举作为基础并使用 select 创建新对象:

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

您可以附加一个调试器,new每次都会执行。这与您的代码几乎相同,但您不必提供虚假范围。你只提供一个null你想重复的假对象......

于 2021-10-04T11:18:48.657 回答