更清洁的方式来初始化和填充一个新的列表<>?
问题描述:
没有使用方法创建列表后,并且不使用数组或新列表<>(数组),是否有语法使此代码更清洁?更清洁的方式来初始化和填充一个新的列表<>?
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 };
答
你可以尝试让使用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。基于后一个事实,你不能说这是一个性能问题。有些系统可能会造成这种差异,但性能会受到很大影响。另一方面,这种差异不会以任何方式引人注目。
答
也许太简单了,但不能创建自己的专业列表吗? 类似于:
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
一个简单的For循环? – Mishka
当然我可以使用数组。我不想使用数组。我想使用List ,并在创建List时填充它。 – Carter81
你可以用for循环来做 – Alander