在asp.net mvc中嵌套的foreach性能

时间:2015-02-21 03:44:38

标签: c# asp.net-mvc performance loops foreach

我有以下嵌套的foreach循环,在ASP.NET MVC网站的控制器中运行大约需要17秒,我正在寻找减少时间的建议。

  • AllObj1是ObjectType1的大约1000个对象的列表。
  • AllObj2是ObjectType2的大约10个对象的列表。

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秒。

有关如何更快地替换这段代码的任何建议吗?

3 个答案:

答案 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));

(我假设IDint,但如果没有将HashSet<int>更改为您实际需要的任何类型。)

使用HashSet<>这应该非常快。