更清洁的方式来初始化和填充新的List <>?

Car*_*r81 2 c# linq syntax

在创建List之后不使用方法,并且不使用数组或新的List <>(数组),是否有语法使这段代码更干净?

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()  
};
Run Code Online (Sandbox Code Playgroud)

在初始化时,是否有更简洁的方法来写这个?就像是...

List<CustomObject> list = new List<CustomObject> { new CustomObject() * 10 };
Run Code Online (Sandbox Code Playgroud)

Chr*_*tos 10

您可以尝试使用Enumerable.Range:

var list = Enumerable.Range(0, 10)
                     .Select(i => new CustomObject())
                     .ToList();
Run Code Online (Sandbox Code Playgroud)

更新

绝对使用上面的代码比使用你已经使用的集合初始化程序要慢,正如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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在下面找到测试结果

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 |
Run Code Online (Sandbox Code Playgroud)

很明显,如果你使用Enumerable.Range方法,你需要的不仅仅是使用集合初始化方法的两倍.但是在这两种情况下,你都不到1毫秒.根据后一个事实,你无法分辨这是否会影响性能.有些系统会产生巨大的性能影响.另一方面,有些系统认为这种差异在任何方面都不会引人注意.