C# 如何优化将多个集合追加到单个列表? reportdata是IEnumerable类型,其中还包含一组记录。 lstreptdataprint是一个列表。 reportdata conatins 500记录。

C# 如何优化将多个集合追加到单个列表? reportdata是IEnumerable类型,其中还包含一组记录。 lstreptdataprint是一个列表。 reportdata conatins 500记录。,c#,C#,这个循环占用了很多时间,我想减少它。 我知道还有其他方法吗?我不确定这是否会优化此解决方案,但您可以将其缩减为一行: foreach (var data in reportdata) { lstReportDataPrint.AddRange(data.ToList()); } 请注意,由于takes IEnumerable,因此在代码中不需要调用ToList:它会创建List的新副本,该副本在调用AddRange后立即丢弃。避免打这个电话可以节省你一些时间。但是,循环性能不佳的最可能原

这个循环占用了很多时间,我想减少它。
我知道还有其他方法吗?

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

foreach (var data in reportdata)
{
   lstReportDataPrint.AddRange(data.ToList());
}
请注意,由于takes IEnumerable,因此在代码中不需要调用ToList:它会创建List的新副本,该副本在调用AddRange后立即丢弃。避免打这个电话可以节省你一些时间。但是,循环性能不佳的最可能原因可能是获取被迭代数据的代码。

我喜欢这种方法,但是您需要.Net 4.5或更高版本,并且不能保证能够帮助它运行得更快。试试看

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

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

Parallel.ForEach(reportdata, (data) =>
{
    lstReportData.AddRange(data.ToList());
});
在我运行的一些测试中,与LINQ相比,这几乎将执行时间减少了一半。 因此,这是一个悲哀的提醒,即eyecandy和performance是两个完全不同的概念


享受

使用,卢克!如果给出了更完整的代码示例,我建议这个问题更适合。这假设AddRange是线程安全的。Parallel.ForEach也比ForEach花费更多的时间。这比foreach@user2691432这是完全可能的。你试过从AddRange调用中删除ToList吗?是的,我放了完全相同的行。如果记录较少,则速度稍快,但如果记录较大,则所需时间比原始时间长得多。
for (int dataID = 0; dataID < reportdata.Count; dataID++)
{
    for (int recordID = 0; recordID < 500; recordID++)
    {
        lstReportDataPrint.Add(reportdata[dataID][recordID]);
    }
}