Более быстрое и менее глупое сопоставление предметов из 2 коллекций.

Привет, мне нужно перебрать две коллекции, содержащие разные типы объектов, и выполнить сопоставление, добавив совпадающие элементы в третий список.

private CheesyMatch( BindingList< MyTypeA > theListA, BindingList< MyTypeB > theListB )
    {
        foreach( MyTypeA item in theListA )
        {
            foreach( MyTypeB item2 in theListB )
            {
                if( item.name == item2.name )
                {
                    item.matched = true;
                    item2.matched = true;
                    MyMatchedList.items.add( new matchedItem( item, item2 ) );
                }
            }
        }
    }

Есть ли лучший/более эффективный способ сделать это? (Я немного упростил ситуацию, так как в моем коде есть некоторый код, который копирует новые локальные коллекции перед их итерацией, так как у меня были проблемы с потоками.


person George Foot    schedule 12.05.2011    source источник


Ответы (1)


Не уверен, что это за язык, но должен быть какой-то метод вроде «существует» или «содержит», когда вы выполняете два цикла подряд. В псевдокоде

foreach item in ListA
   if ListB.exists(item) then
      MatchedList.items.add(item)
   end if
endfor
foreach item in ListB
   if ListA.exists(item) then
      MatchedList.items.add(item)
   end if
endfor

Таким образом, вы просматриваете каждую коллекцию только один раз, а не делаете ListB N раз, где ListA имеет N элементов. Имеет ли это смысл?

person MikeMurko    schedule 12.05.2011
comment
В самом деле? а что делает exists? - person Andrey; 13.05.2011
comment
возможно, он использует поиск более низкого уровня по элементам. не уверена. вы делаете анализ производительности, если хотите на этом таинственном языке. - person MikeMurko; 13.05.2011
comment
Да, это имеет смысл, но у меня есть третий класс (MatchedItem), который содержит ссылку на TypeA и TypeB внутри него (и некоторые другие вещи), поэтому мне нужно добавить их оба во время создания. - person George Foot; 13.05.2011