2010-08-12 71 views
3

有沒有什麼辦法可以優化這樣的:優化:我應該如何優化集合的Linq Concat? C#

public static IEnumerable<IEnumerable<int>> GenerateCombinedPatterns 
    (IEnumerable<IEnumerable<int>> patterns1, 
    IEnumerable<IEnumerable<int>> patterns2) 
{ 
    return patterns1 
      .Join(patterns2, p1key => 1, p2key => 1, (p1, p2) => p1.Concat(p2)) 
      .Where(r => r.Sum() <= stockLen) 
      .AsParallel() 
     as IEnumerable<IEnumerable<int>>; 
} 
+0

您可以跳過「作爲IEnumerable >」部分。這是隱含的。 – 2010-08-12 07:54:11

+0

數據來自數據庫嗎? – 2010-08-12 09:21:14

+0

不是它對從文件導入的東西集合的操作。我已檢查了其他區域..文件導入和導出不需要時間..甚至代碼模式的生成..但這塊代碼似乎放慢了一切。 – Sam 2010-08-12 09:31:23

回答

2

如果您正在尋找每一個組合,使用SelectMany相反,通常有多個「從」條款執行:

return from p1 in patterns1 
     from p2 in patterns2 
     let combination = p1.Concat(p2) 
     where combination.Sum() <= stockLen 
     select combination; 

這是沒有任何並行,雖然...這取決於預期的集合,我可能只是並行在一個級別,例如

return from p1 in patterns1.AsParallel() 
     from p2 in patterns2 
     let combination = p1.Concat(p2) 
     where combination.Sum() <= stockLen 
     select combination; 

注意,有沒有擔保,以作爲對於結果出來與上面的順序 - 你需要調整它,如果你想原始排序。

1

在最末尾使並行查詢無點。 更新:喬恩是對的,我的初步解決方案是不正確的,結果我的改正解決方案基本上與他的相同。

public static IEnumerable<IEnumerable<int>> GenerateCombinedPatterns 
    (IEnumerable<IEnumerable<int>> patterns1, 
    IEnumerable<IEnumerable<int>> patterns2) 
{ 
    var parallel1 = patterns1.AsParallel(); 
    return parallel1.SelectMany(p1 => patterns2.Select(p2 => p1.Concat(p2))) 
     .Where(r => r.Sum() <= stockLen); 
} 
+0

我不相信這跟原來的一樣。 – 2010-08-12 08:23:14

+0

是的,我正在看那個加入(),並在第二次看,也許是一個扁平化,而這是我最初的猜測。 – 2010-08-12 08:30:03

+0

如果我添加.AsParallel然後應用程序似乎需要約6倍的時間,如果它不使用。 – Sam 2010-08-12 09:33:22