2015-12-13 4 views
-4

У меня есть этот класс: .NET Framework 3.5Сравните два списка классов в C#

Class my_class { 
string name; 
int val_1; 
int val_2; 
. 
. 
. 
int val_n; 
} 

И у меня есть следующие списки:

List<my_class> list1; 
List<my_class> list2; 
List<my_class> result1; 
List<my_class> result2; 
List<my_class> resultEdit; 

Оба list1 и list2 могут содержать более 500K в 1 миллион объект.

result1 список должен содержать объекты, которые существуют на list1 и не существует на list2.

result2 список должен содержать объекты, которые существуют на list2 и не существует на list1.

resultEdit должны содержать объект, которые существуют на обоих list1 и в list2, но один из val_1, val_2, ... val_n различны между list1 и list2.

Пример:

List1 = { {"A",1,2,3,4} , {"B",1,2,3,4}, {"C",1,2,3,4} }; 
List1 = { {"A",1,2,3,4} , {"D",1,2,3,4}, {"C",1,4,3,4} }; 

Результаты должны быть:

result1 = {{"B",1,2,3,4}}; 
result2 = {{"D",1,2,3,4}}; 
resultEdit1 = {{"C",1,2,3,4}}; 

Я знаю, что есть много способов сделать это, но с большим количеством элементов в каждом списке (более 500K в каждом списке) время процесса не очень хорошо!

Итак, любой хороший, быстрый способ достичь этого?

Примечание: Время обработки так важно для меня, и памяти также

+2

Это уникально, тогда HashSet очевидная альтернатива, обеспечивает амортизированный доступ O (1) и O (n) для операций с множеством. Если поддержание порядка важно, вам также необходимо сохранить в нем список. –

+0

Если стандартный «Enumerable.Except» с компаратором не работает для вас (я предполагаю, что, как вы сказали, вы не можете достичь желаемой цели с регулярной реализацией), тогда ваш вопрос может быть слишком широким для SO и, возможно, по теме на одном из других более теоретических сайтов SE. –

+0

So что ты уже испробовал? –

ответ

2

Ну, есть много вещей, отсутствующих в описании, но я хотел бы сделать некоторую предварительную обработку данных, прежде чем сравнивать:

  1. Добавить функцию сортировки для каждого элемента. Итак, я бы перенесла {«A», 1, 2, 3, 4} на объект строки <, int>, где строка - это имя («A»), а int - номер 1234 (в зависимости от на значение n. Если он слишком длинный, просто используйте строку).
  2. Теперь вы можете отсортировать элементы в соответствующей структуре данных (< «A», 1234> поступит раньше < «A», 1235>). Я бы использовал словарь с отсортированным списком в каждом ключе.
  3. Теперь найти разные результаты проще. Например, для < «A», 1234 »> в списке1, просто проверьте, существует ли это под ключом« A »в списке 2. Этот поиск теперь должен быть намного быстрее.
+1

Кажется, что OP удалило указание, что имя является уникальным свойством в списке. –

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