我有以下嵌套的foreach循环,在ASP.NET MVC网站的控制器中运行大约需要17秒,我正在寻找减少时间的建议。
foreach的目的是比较两个列表的内容以匹配ID值,并将该子集添加到第三个列表。
foreach (ObjectType1 obj1 in AllObj1) {
foreach (ObjectType2 obj2 in AllObj2) {
if (obj1.ID == obj2.ID) {
NewList.Add(obj1.ObjectVariable);
}
}
}
正如您所看到的,在此代码中,这可能意味着最多需要进行10,000次比较,并且速度极慢,在高端Azure部署上运行时间增加2秒,达到19秒。
有关如何更快地替换这段代码的任何建议吗?
答案 0 :(得分:1)
您可以使用LINQ查询来获取公共ID值
var common = AllObj1.Select(x => x.ID).Intersect(AllObj2.Select(y => y.ID));
然后另一个生成新列表
var results = AllObj1.Where(x => common.Contains(x.ID)).Select(x => x.ObjectVariable);
答案 1 :(得分:1)
如果是我,我会从这里开始。 (使用linq .join)
如果它的速度很慢,可能会发生更深层次的事情(正在访问导致dB命中的属性?)。
(借口类型等,我在平板电脑上写代码并不精彩)
var newlist = Allobj1.join(allobj2,
a1=>a1.Id,
a2=> a2.Id,
(a1, a2) => a1.objectVariable)
.ToList();
答案 2 :(得分:0)
尝试这样做:
var idHash = new HashSet<int>(AllObj2.Select(x => x.ID));
NewList.AddRange(AllObj1.Where(x => idHash.Contains(x.ID));
(我假设ID
是int
,但如果没有将HashSet<int>
更改为您实际需要的任何类型。)
使用HashSet<>
这应该非常快。