2016-03-21 46 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次。 –