2012-11-25 31 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