2016-03-21 82 views
2

我從另一個列表中添加數據列表的對象:合併兩個不同類型的列表

public void MergeLsts(List<A> lstA, List<B> lstB) 
{ 
    foreach (A dataA in lstA) 
    { 
     foreach (B dataB in lstB) 
     { 
      if (dataA.ItemNo == dataB.ItemNo) 
      { 
       //dataA.ItemDescription is up to this point empty! 
       dataA.ItemDescription = dataB.ItemDescription; 
      } 
     } 
    } 
    DoSomethingWithTheNewLst(lstA); 
} 

這工作完全正常。然而這需要相當長的時間,因爲這兩個列表變得非常大(lstA中的約7萬個項目和lstB中的約20k個項目)。

我想知道是否有更快或更有效的方法來完成我所需要的?也許與LINQ?

+0

如果收藏品的長度相同,您可以使用.Zip() –

+1

我假設您可以訂購ItemNo中的數據。如果您想手動執行此操作(不使用某些庫函數),則可以這樣做:按ItemNo對兩個列表進行排序,以類似於合併排序中的合併步驟的方式添加數據。這應該在nlogn中工作。 – Aziuth

回答

2

您可以用Join()複雜O(n)代替O(N²)做到這一點:

var joinedData = dataA.Join(dataB, dA => dA.ItemNo, dB => dB.ItemNo, (dA, dB) => new { dA, dB })); 
foreach(var pair in joinedData) 
{ 
    pair.dA.ItemDescription = pair.dB.ItemDescription; 
} 

DistinctGroupByJoin操作使用散列,所以他們應該是接近O(N),而不是O(N²)

+0

不參加有O(n^2)本身的複雜性?所以你的解決方案是O(n^3) – Domysee

+0

剛發現他們[接近O(n)](http://stackoverflow.com/questions/2799427/what-guarantees-are-there-on-the - 運行時間複雜度,大O型的,LINQ的方法)。因此,您的解決方案的複雜度爲(n^2),而不是O(n) – Domysee

+0

@Domysee否,我的解決方案的O(2n)複雜度等於O(n)。我迭代N個元素兩次,O(n^2)表示N個元素迭代N次。 –