创建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 };
答案 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);
}
}
}