Более быстрое и менее банальное сопоставление элементов из 2 коллекций

#collections #matching

#Коллекции #сопоставление

Вопрос:

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

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

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

Ответ №1:

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

 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 элементов. Имеет ли это смысл?

Комментарии:

1. серьезно? и что exists делает?

2. возможно, он использует поиск более низкого уровня по элементам. не уверен. вы действительно проводите анализ производительности, если хотите, на этом загадочном языке.

3. Да, это имеет смысл, но у меня есть 3-й класс (MatchedItem), который содержит ссылку на TypeA и TypeB внутри него (и некоторые другие вещи), поэтому мне нужно добавить их оба во время построения.