#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. Отлично, спасибо за предложения. Я взял первый образец за основу своего.