2013-08-20 42 views
3

我試圖重新寫了使用LINQ以下轉換嵌套的foreach到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快得多?

+3

不應該'a.quantity = ...'是'a.quantity == ...'嗎? –

+1

當你想「更改/更新/分配某些東西」時,你不應該想到'LINQ'這就是爲什麼'Q'代表'Query'的原因。它幾乎用於查詢,選擇,過濾,排序...不是用於更改,更新,分配......雖然你可以做,但它與foreach非常相似,它也可能涉及使用「ForEach」靜態方法。 –

+1

我非常懷疑它會更快。如果你正在尋找性能,只需添加一個休息時間;在內部的foreach循環內,就是這樣。 – Save

回答

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

但心中它不會更快

+0

是不是隻是要做同樣的事情嵌套循環?我認爲它不會更快。 –

+0

它給我一個錯誤「不能隱式轉換類型System.Collections.Generic.IEnumerable 浮動」讓我看看哪一個需要轉換。 –

+0

@JimMischel是的,它會做同樣的事情,但我可以理解的問題是,提問者無法將它寫入LINQ查詢的形式,因爲Where使用而不是ForEach –

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; 
+0

我從來沒有見過語法'在新的{ass.unitActn,ass.unitCode,ass.unitLength}等於新{(agg.catagory.unitActn,agg.catagory.unitCode,agg.catagory.unitLength}'比較多個項目之前,我不知道它可以處理該問題。是否可以在所有情況下工作(Linq2Objects和Linq2Entities)? –

+0

@ScottChamberlain是的,它會。 – MarcinJuraszek

+0

很好,這是一種'先選擇 - 稍後分配',這樣我們就可以更好地使用LINQ' :) –

1

爲什麼LINQ的?它不可能比你得到的更快。它不太可能比你所擁有的更簡單或更容易閱讀或更易於調試。

如果你正在尋找提高性能,你的嵌套循環O對運行(MN)時,其中是組件集合的大小和ñ是聚集集合的大小,所以基本上Ø (n )時間。

集合是否按關鍵值排序?如果是這樣,通過以兩步迭代的方式合併兩個集合將是一個巨大的勝利。這應該會讓你失望到O(n)的表現。

如果它們沒有排序,那麼在遍歷程序集集合之前,您可以通過獲取聚集集合並將它轉換爲像Dictionary這樣的查找表來獲得勝利。然後它對程序集進行直接迭代,並且可以快速查找字典。