2012-11-25 28 views
7

目前,我使用的是这样建立10个对象的列表:如何使用linq初始化重复元素的数组?

myList = (from _ in Enumerable.Range(0, 10) select new MyObject {...}).toList() 

这是基于了我的蟒蛇背景,在那里我会写:

myList = [MyObject(...) for _ in range(10)] 

注意我希望我的列表包含我的对象的10个实例,而不是同一个实例10次。

这仍然是一个明智的方式在C#中做事吗?通过简单的for循环以这种方式进行成本是否有成本?

+0

你在MyObject的某个地方使用Range值还是只需要任意的对象? – Tilak

+0

@Tilak:任意对象(因​​此是下划线) – Eric

+0

IMO简单循环对于LINQ查询而言可忽略不计(可读性/性能)。 – Tilak

回答

4

个人而言,我认为Enumerable.Repeat缺少超载。一个方便的除了是这样的:

public static class EnumerableEx 
{ 
    public static IEnumerable<T> Repeat<T>(int amt, Func<T> producer) 
    { 
     for(var i = 0; i < amt; ++i) 
     { 
      yield return producer(); 
     } 
    } 
} 

,所以你可以

EnumerableEx.Repeat(10,() => new object()) //.ToList() 
+0

重载不会削减它 - 你将无法创建一个迭代10次的函数。 – Eric

+0

划痕 - 你可以通过返回类型区分两种情况 – Eric

1

你可以试试:

Enumerable.Range(0, 1000).Select(x => new MyObject()).ToArray(); 
8

流利的API看起来有点更具可读性在这种情况下,但其不太容易看出你的代码的意图:

var list = Enumerable.Range(0, 10).Select(_ => new MyObject()).ToList(); 

简单,如果循环是快速和容易理解,但它也隐藏意图 - 的10个项目

创建列表
List<MyObject> list = new List<MyObject>(); 
for (int i = 0; i < 10; i++) 
    list.Add(new MyObject()); 

的可读性最好的事情是一个建设者,这将说明你的意图

public class Builder<T> 
    where T : new() 
{ 
    public static IList<T> CreateListOfSize(int size) 
    { 
     List<T> list = new List<T>(); 
     for (int i = 0; i < size; i++) 
      list.Add(new T()); 
     return list; 
    } 
} 

用法:

var list = Builder<MyObject>.CreateListOfSize(10); 

该解决方案速度如同简单循环,意图非常明确。在这种情况下,我们也有最少量的代码可供编写。

+1

很确定'Enumerable.Range(0,10)'给出了11个值 – Eric

+3

@Eric很确定第二个参数是'count' –

+2

哎呦,我站好了更正 – Eric