Объединить два списка объектов, содержащих разные данные

#c# #list

#c# #Список

Вопрос:

У меня есть объект, Project который имеет несколько полей, одно из которых Name . У меня есть одна электронная таблица проектов, которая содержит некоторые из этих полей, и другая, которая содержит остальные. Однако в обеих электронных таблицах есть Name поле.

Я прочитал их и заполнил два List<Project> , заполнив доступные поля только из этого конкретного источника. Например. проект из списка 1 выглядит следующим образом:

 {Name="MyProj", Type="Form", Priority=NULL}
  

В то время как проект из списка 2:

 {Name="MyProj", Type=NULL, Priority="High"}
  

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

Как я могу этого добиться? Есть ли какие-нибудь хорошие способы сделать это кратко?

Спасибо

Ответ №1:

Я бы, вероятно, использовал ?? оператор для поиска значений. Словарь мог бы быть полезен.

 // put one into a dict for faster access
var dict2 = list2.ToDictionaty(x => x.Name, x);

// merge the lists using ??
var merged = list1.Select(x => 
{
    var p2 = dict2[x.Name];
    return new Project()
    {
      Name = x.Name,
      Type = x.Type ?? p2.Type,
      Priority = x.Priority ?? p2.Priority 
    }
});
  

Или

 var merged = list1
  // join the lists by the name 
  .Join(list2, x => x.Name, x => x.Name, (p1, p2) => new { P1 = p1, P2 = p2 } )
  .Select(x => 
    new Project()
    {
      Name = P1.Name,
      Type = P1.Type ?? P2.Type,
      Priority = P1.Priority ?? P2.Priority 
    });
  

Существует сотня вариантов этого. Вы могли бы объединить и обработать результат только в foreach , чтобы объединить данные одного списка в другой. И т.д.

Это усложняется, когда проекты могут отсутствовать в одном из списков, и еще больше усложняется, если ни один из списков не является полным. Тогда было бы полезно создать полный список названий проектов в начале.

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

1. Отлично, спасибо за предложения. Я взял первый образец за основу своего.