如何优化将多个集合附加到单个列表?

时间:2014-06-27 15:12:12

标签: c#

foreach (var data in reportdata)
{
   lstReportDataPrint.AddRange(data.ToList());
}
  1. reportdata 是IEnumerable类型,它还包含一系列记录。
  2. lstReportDataPrint 是一个列表。
  3. reportdata 包含500条记录。
  4. 这个循环花了很多时间,我想减少它。 我还有其他办法吗?

3 个答案:

答案 0 :(得分:2)

我不确定这是否会优化此解决方案,但您可以将其缩小为一行:

lstReportDataPrint.AddRange(reportdata.SelectMany(d => d));

请注意,由于AddRange()需要IEnumerable<T>,因此您的代码中ToList()的调用是不必要的:它会创建List<T>的新副本,该副本会在AddRange()之后立即被删除致电{{1}}。避免这个电话会节省你一些时间。但是,循环表现不佳的最可能原因可能在于获取正在迭代的数据的代码。

答案 1 :(得分:1)

请记住,LINQ很棒,看起来很花哨,但由于它与枚举器一起使用,因此速度不是很快。 使用for循环并添加每个值实际上比调用AddRange并使用LINQ更快,尽管AddRange已针对添加大量值进行了优化。

for (int dataID = 0; dataID < reportdata.Count; dataID++)
{
    for (int recordID = 0; recordID < 500; recordID++)
    {
        lstReportDataPrint.Add(reportdata[dataID][recordID]);
    }
}

在我运行的一些测试中,与LINQ相比,这几乎将执行时间减半。 因此,令人遗憾的是,eyecandy和performance是两个完全不同的概念。

享受。

答案 2 :(得分:-1)

我喜欢Parallel.Foreach方法,但是你需要.Net 4.5或更高版本,并且不能保证它能帮助它更快地运行。试一试

Parallel.ForEach(reportdata, (data) =>
{
    lstReportData.AddRange(data.ToList());
});