如果我的列表很大,有没有办法使这个操作运行得更快?
你可以将结果的列表创建移动到计数之后:
List<double?> list1 = new List<double?>();
List<double?> list2 = new List<double?>();
int recordCount = list1.Count > list2.Count ? list2.Count : list1.Count;
List<double?> listResult = new List<double?>(recordCount);
这将让您指定结果所需的确切容量,并避免列表内部的重新分配。对于“巨大列表”,这可能是最慢的部分之一,因为随着列表变得越来越大,内存分配和复制将是最慢的操作。
另外,如果计算简单,您可以潜在地使用多个核:
List<double?> list1 = new List<double?>();
List<double?> list2 = new List<double?>();
int recordCount = list1.Count > list2.Count ? list2.Count : list1.Count;
var results = new double?[recordCount]; // Use an array here
Parallel.For(0, recordCount, index =>
{
double? result = list1[index] + list2[index];
results[index] = result;
});
考虑到这里的“工作”非常简单,为了充分利用并行性能,您可能需要定制分区器(详见如何:加快小循环体速度):
var results = new double?[recordCount];
var rangePartitioner = Partitioner.Create(0, recordCount);
Parallel.ForEach(rangePartitioner, range =>
{
for (int index = range.Item1; index < range.Item2; index++)
{
results[index] = list1[index] + list2[index];
}
});
如果这不是瓶颈,你可以使用LINQ来将其转换为一行代码:
var results = list1.Zip(list2, (one, two) => one + two).ToList();
然而,如果性能真的是瓶颈,那么这将比自己处理循环略微低效。