2017-10-08 18 views
3

沒有使用方法創建列表後,並且不使用數組或新列表<>(數組),是否有語法使此代碼更清潔?更清潔的方式來初始化和填充一個新的列表<>?

List<CustomObject> list = new List<CustomObject> 
{ 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject(), 
    new CustomObject() 
}; 

有沒有更清晰的方式來寫這個,當初始化?喜歡的東西...

List<CustomObject> list = new List<CustomObject> { new CustomObject() * 10 }; 
+1

一個簡單的For循環? – Mishka

+0

當然我可以使用數組。我不想使用數組。我想使用List <>,並在創建List時填充它。 – Carter81

+0

你可以用for循環來做 – Alander

回答

10

你可以嘗試讓使用Enumerable.Range

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

更新

絕對使用上面的代碼是速度較慢,使用你已經集合初始化使用,正如mjwills在他的評論中指出的那樣。爲了衡量如何更慢的是這種方法比我設置了下面的測試情況下,集合初始化方法,我用了BenchmarkDotNet

public class CustomObject 
{ 
} 

public class ListInitiator 
{ 
    [Benchmark] 
    public List<CustomObject> InitializeList() 
    { 
     return new List<CustomObject> 
     { 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject(), 
      new CustomObject() 
     }; 
    } 

    [Benchmark] 
    public List<CustomObject> InitializeListUsingEnumerableRange() 
    { 
     return Enumerable.Range(0, 10) 
      .Select(i => new CustomObject()) 
      .ToList(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var summary = BenchmarkRunner.Run<ListInitiator>(); 
    } 
} 

下面你可以找到測試

Processor=Intel Core i5 CPU 760 2.80GHz (Nehalem), ProcessorCount=4 
Frequency=2732435 Hz, Resolution=365.9739 ns, Timer=TSC 
    [Host]  : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2110.0 
    DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2110.0 

|        Method |  Mean | Error | StdDev | 
|----------------------------------- |---------:|---------:|---------:| 
|      InitializeList | 319.6 ns | 3.904 ns | 3.260 ns | 
| InitializeListUsingEnumerableRange | 642.4 ns | 9.139 ns | 8.549 ns | 

的結果如果使用Enumerable.Range方法,則需要使用集合初始值設定方法的兩倍時間以上的時間需要。但是,在這兩種情況下,你都大大低於1ms。基於後一個事實,你不能說這是一個性能問題。有些系統可能會造成這種差異,但性能會受到很大影響。另一方面,這種差異不會以任何方式引人注目。

+0

這將只創建一個'CustomObject'並重復10次,不是10個新的'CustomObject's。 – PetSerAl

+0

@PetSerAl正確!我很壞:(改正了,謝謝! – Christos

+0

這正是我在找的東西,我覺得C#有些新東西我還沒有學到,Linq是有道理的 – Carter81

2

舊的for循環有什麼問題?

var myList = new List<CustomObject>(); 
for (int i = 0; i < 10; i++) 
{ 
    myList.Add(new CustomObject()); 
} 
+0

C#允許你在一個方法之外使用一個循環? – Carter81

+0

C#只允許在方法之外聲明。沒有理由不在構造函數或其他方法中初始化列表。當你聲明它時完全填充它並不是好的做法。 – stybl

+0

是的,這就是爲什麼循環不起作用。 – Carter81

2

也許太簡單了,但不能創建自己的專業列表嗎? 類似於:

public class MyList<T> : List<T> where T : new() 
{ 
    public MyList(T o, int times) 
    { 
     for (int i = 0; i < times; i++) 
     { 
      this.Add(o); 
     } 
    } 
} 
+0

我只是好奇,如果有一種方法來執行列表初始化過程中。那麼,我知道在構造函數中完成它就是這麼做的,但我只是在查看是否有語法來做到這一點,就像我在第二個代碼片段中展示的那樣。謝謝。 – Carter81

相關問題