Дан такой набор записей:
string ID1;
string ID2;
string Data1;
string Data2;
// :
string DataN
Первоначально Data1..N равны нулю, и их можно игнорировать для этого вопроса. ID1 и ID2 однозначно идентифицируют запись. Все записи будут иметь ID2; у некоторых также будет ID1. Учитывая ID2, существует (трудоемкий) метод получения соответствующего ID1. Имея ID1, существует способ (затратный по времени) для получения Data1..N для записи. Наша конечная цель — как можно быстрее заполнить Data1..N для всех записей.
Наша ближайшая цель — (как можно быстрее) устранить все дубликаты в списке, сохранив тот, который содержит больше информации.
Например, если Rec1 == {ID1="ABC", ID2="XYZ"} и Rec2 = {ID1=null, ID2="XYZ"}, то это дубликаты, --- НО мы должны специально удалить Rec2 и сохранить Rec1.
Это последнее требование устраняет стандартные способы удаления дубликатов (например, HashSet), поскольку они считают обе стороны «дубликата» взаимозаменяемыми.