更清洁的方式来初始化&填充新的列表<>?

时间:2017-10-08 09:08:56

标签: 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()  
};

初始化时有没有更简洁的方法来写这个?有点像...

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

3 个答案:

答案 0 :(得分: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方法,你需要超过使用集合初始化方法的双倍时间。但是在这两种情况下,你都不到1毫秒。根据后一个事实,你无法分辨这是否会影响性能。有些系统可以很好地发挥这种差异。另一方面,有些系统不会以任何方式显示出这种差异。

答案 1 :(得分:2)

旧的for循环有什么问题?

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

答案 2 :(得分: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);
        }
    }
}