C# 创建包含对象新实例的列表

C# 创建包含对象新实例的列表,c#,linq,list,C#,Linq,List,创建包含任意数量同一对象实例的列表的最佳方法是什么?i、 e是否有一种更紧凑或更有效的方法来执行以下操作 static List<MyObj> MyObjs = Enumerable.Range(0, 100) .Select(i => new MyObj()) .ToList(); 静态列表MyObjs=Enumerable.Range(01100) .Select(i=>newmyobj()) .ToList(); (Enumerable.Repeat会

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

static List<MyObj> MyObjs = Enumerable.Range(0, 100)
    .Select(i => new MyObj())
    .ToList();
静态列表MyObjs=Enumerable.Range(01100) .Select(i=>newmyobj()) .ToList();
Enumerable.Repeat
会给我十个对同一对象的引用,所以我认为它不起作用。)

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

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

我很好奇你对
可枚举性的评论。重复一下
,所以我试了一下

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

我确认它们确实都共享相同的引用,就像上面提到的OP一样。

不确定在这种情况下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());
       }
    }
}
公共类MyClass
{
静态int容量=100;
静态列表MyObjs=新列表(容量);
静态MyClass(){
对于(变量i=0;i
这不难作为迭代器实现:

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();
    }
}
IEnumerable CreateItems(int计数),其中T:new(){
返回CreateItems(count,()=>newt());
}
IEnumerable CreateItems(整数计数,函数创建者){
for(int i=0;i
我看不出您当前的方法有任何问题……我不是说有问题。。。这感觉就像是一个黑客。“这感觉就像是一个黑客。”为什么,一点也不!这胜过了一个简单的循环:-)这看起来确实是最好的方法。我的意思是,你仍然可以为
循环使用
,或者反射的
激活器
@CharlieBrown如果你想要不同的
MyObj
,你不能使用
重复
。它将为您提供100次相同的实例。当您执行
myList[i]=…
时,您将覆盖这些实例。创建一个带有属性栏的类Foo,然后是更改栏,您将看到它对每个索引都会更改。@cadrell0谢谢您的评论。你说得对,我是在那里自杀的。我将在这里留下我的答案,只是为了给其他人一个教训,告诉他们不应该做什么。使用
ToList
使用
列表(IEnumerable items)
构造函数
列表
,我相信这比为每个项目调用
Add
要快一点。至少是一样的<代码>范围
在内部为
循环使用
。您的解决方案充其量只是性能相同,但代码更多。由于类型已从int更改为MyObj,.Select方法必须创建新枚举。它还必须调用一个匿名方法100次,并最终将其转换为一个列表。范围和选择都使用
收益率返回
。因为执行延迟到调用
ToList
的点,所以结果只枚举一次,这在构建列表时发生。但是简单地延迟执行并不能阻止执行。最后一个ToList调用仍然会触发对Func(i){returnnewmyobj()}的100个调用。诚然,这是有效的,但它必须有一些额外的开销。尽管如此,如果我在编写代码,并且容量很小,我也会选择单行程序。