Итак, вот сделка. (Мой текущий вариант использования находится в C#, но меня также интересует общий алгоритмический случай) Мне дано два массива объектов (к сожалению, мне не удается изменить код, который создает эти массивы). Каждый объект имеет (как часть его) свойство .Name, строку. Эти строки уникальны для каждого объекта, и у них есть нуль или одна соответствующая строка в другом объекте. Что мне нужно сделать, это эффективно соединить эти объекты на основе этой строки, в какую-то коллекцию, которая позволяет мне получить доступ к сопряженным объектам. Строки должны соответствовать точно, чтобы считаться совпадением, поэтому мне не нужен какой-либо верхний или случайный чувствительный элемент и т. Д. К сожалению, эти списки не сортируются. Списки сами могут быть 30-50 элементов, но мне нужно повторить алгоритм на тысячах этих пар массивов подряд, поэтому эффективность важна.Эффективно спаривание объектов в списках на основе ключа
Поскольку я знаю, что есть 0 или 1 совпадение, и я знаю, что большинство из них будет 1, я считаю, что есть более эффективный алгоритм, чем x * y (элемент Foreach в x, foreach item в y, if х = у, то х и у спичка)
Я считаю, что наиболее вероятные варианты:
Держите несортированный список и вобще х * у, но падение предметов из списка, как только я нашел их поэтому я не проверяю уже найденные, OR: Преобразуйте оба словаря, а затем выполните индексированный поиск по каждому из них (array2 [currentArray1Item]) ИЛИ: Сортируйте списки самостоятельно (Array.Sort()), а затем отсортированные массивы, я, вероятно, могу сделать что-то умное, как прыжок в индекс в B, где я ожидал бы его найти (везде, где он был в A), а затем перемещаться вверх или вниз по строке до тех пор, пока Я либо нахожу его, либо передаю, где он должен был быть.
После этого мне нужно выяснить, как его сохранить, я полагаю, что могу создать собственный класс ObjectPair, который просто держит объекты A и B. Мне не нужно ничего делать, потому что я просто собираюсь ForEach на парах.
Итак, вопросы: Являются ли какие-либо из вышеперечисленных алгоритмов самым быстрым способом сделать это (если нет, что такое?) И существует ли какая-то существующая структура C#, которая бы удобно удерживала найденные пары?
EDIT: Array.Sort() - метод, который существует, поэтому мне не нужно преобразовывать массив в List для сортировки. Хорошо знать. Обновлено выше.
Мне скорее нравится результат анонимной пары объектов, который вы использовали здесь, я забыл рассмотреть этот вариант для конечного набора результатов матчей. Я попробую запустить этот подход соединения LINQ и запустить сортировку и двоичный поиск рядом с каждым, чтобы увидеть, что работает лучше для меня. Благодаря! – WakeflyCBass