2017-10-08 19 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

相关问题