3

我正在尝试使用 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 快得多?

4

3 回答 3

7

我希望 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;
于 2013-08-20T16:42:18.667 回答
1

为什么是林克?它不太可能比你所拥有的更快。它不可能比你所拥有的更简单、更容易阅读或更容易调试。

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

集合是否按键值排序?如果是这样,通过同步迭代两个集合来合并两个集合将是一个巨大的胜利。这应该会让你降低到 O(n) 的性能。

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

于 2013-08-20T17:27:45.397 回答
0

尝试这个:

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

但请注意它不会更快

于 2013-08-20T16:39:36.633 回答