将嵌套Foreach转换为Linq
本文关键字:Linq 转换 Foreach 嵌套 | 更新日期: 2023-09-27 18:28:25
我正在尝试使用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(n2)时间。
集合是否按键值排序?如果是这样的话,通过同步迭代来合并这两个集合将是一个巨大的胜利。这应该会让你归结为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)));
但请注意,不会更快