【发布时间】:2018-05-04 08:35:26
【问题描述】:
我有以下代码:
var tempResults = new Dictionary<Record, List<Record>>();
errors = new List<Record>();
foreach (Record record in diag)
{
var code = Convert.ToInt16(Regex.Split(record.Line, @"\s{1,}")[4], 16);
var cond = codes.Where(x => x.Value == code && x.Active).FirstOrDefault();
if (cond == null)
{
errors.Add(record);
continue;
}
var min = record.Datetime.AddSeconds(downDiff);
var max = record.Datetime.AddSeconds(upDiff);
//PROBLEM PART - It takes around 4,5ms
var possibleResults = cas.Where(x => x.Datetime >= min && x.Datetime <= max).ToList();
if (possibleResults.Count == 0)
errors.Add(record);
else
{
if (!CompareCond(record, possibleResults, cond, ref tempResults, false))
{
errors.Add(record);
}
}
}
变量诊断是记录列表
变量 cas 是包含大约 50k 项的记录列表。
问题是它太慢了。第一个 where 子句的部分需要大约 4,6599 毫秒,例如对于 List diag 中的 3000 条记录,它需要 3000*4,6599 = 14 秒。有没有优化代码的选项?
【问题讨论】:
-
您可以在 forEach 循环之外预过滤
codes以仅包含活动的项目。这将减少您必须在循环中搜索的数量。 -
是的,确实如此,谢谢您的通知。我已经做到了。现在,它好一点了,但主要问题仍然是 where 子句与时间。
标签: c# performance linq optimization