2016-03-21 2 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); 
} 

Это отлично работает. Однако это занимает довольно много времени, потому что оба списка довольно большие (около 70 тыс. Элементов в lstA и 20 тыс. Элементов в lstB).

Мне было интересно, есть ли более быстрый или эффективный способ выполнить то, что мне нужно? Может быть, с LINQ?

+0

Если коллекции имеют одинаковую длину, вы можете использовать .Zip() –

+1

Я предполагаю, что вы можете заказать данные в ItemNo. Если вы хотите сделать это вручную (не используя какую-либо библиотечную функцию), вы можете сделать это: отсортируйте оба списка по ItemNo, добавьте данные способом, похожим на шаг слияния в сортировке слияния. Это должно работать в nlogn. – Aziuth

ответ

2

Вы можете сделать это с O(n) сложностью вместо O(N²) с Join():

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

Distinct, GroupBy и Join операции используют хеширование, поэтому они должны быть близки к O(N) вместо O(N²).

+0

Does not Join имеют сложность самого O (n^2)? Итак, ваше решение будет O (n^3) – Domysee

+0

Только что выяснили, что они [близки к O (n)] (http://stackoverflow.com/questions/2799427/what-guarantees-are-there-on-the-the -run-времени сложность-большой-о-оф-Linq-методов). Таким образом, ваше решение имеет сложность (n^2), а не O (n) – Domysee

+0

@ Domysee no, мое решение имеет сложность O (2n), эквивалентную O (n). Я повторяю N элементов дважды, а O (n^2) говорит, что N элементов итерации N раз. –

Смежные вопросы