将嵌套的Foreach转换为Linq

我试图使用LINQ重写以下内容

foreach (WMCommon.Services.StakeOut.assembly ass in assemblies) { foreach (var agg in aggregate) { if ( agg.catagory.unitActn == ass.unitActn && agg.catagory.unitCode == ass.unitCode && agg.catagory.unitLength == ass.unitLength ) { ass.quantity = agg.qty; } } } 

这是我得到的:

 assemblies.Where( a => a.quantity = ( aggregate.Where( p => p.catagory.unitActn == a.unitActn && p.catagory.unitCode == a.unitCode && p.catagory.unitLength == a.unitLength).Select(s=>s.qty))); 

提前感谢您的帮助。 我希望LINQ比嵌套的FOREACH快得多?

我希望LINQ比嵌套的FOREACH快得多?

通常,除非您更改其工作方式,否则LINQ不会提高您的性能。 LINQ实际上只是为您执行迭代。

在这种情况下,看起来您可以使用连接来改善整体效果,因为这会给您带来同样的效果:

 var query = from WMCommon.Services.StakeOut.assembly ass in assemblies join agg in aggregate on new { ass.unitActn, ass.unitCode, ass.unitLength } equals new { (agg.catagory.unitActn, agg.catagory.unitCode, agg.catagory.unitLength } select new { ass, agg }; foreach(var pair in query) pair.ass.quantity = pair.agg.qty; 

为何选择Linq? 它不可能比你拥有的更快。 与您所获得的相比,它不太可能更简单或更容易阅读或更容易调试。

如果您希望提高性能,您的嵌套循环将在O(mn)时间运行,其中m是程序集集合的大小, n是聚合集合的大小,因此基本上是O(n 2 )时间。

集合是否按键值排序? 如果是这样,通过在锁步中迭代两个集合来合并两个集合将是一个巨大的胜利。 这应该会让你感受到O(n)表现。

如果它们没有被排序,你可以通过获取聚合集合并将其转换为像Dictionary这样的查找表来获得胜利,然后再遍历程序集集合。 然后是对程序集的直接迭代,可能是对字典的快速查找。

试试这个:

 assemblies.ForEach(a => a.quantity = (aggregate.Where(p => p.catagory.unitActn == a.unitActn && p.catagory.unitCode == a.unitCode && p.catagory.unitLength == a.unitLength).Select(s=>s.qty))); 

但请记住它不会更快