Построение нового списка объектов с комбинацией других списков объектов

Вопрос:

У меня есть два списка Client Object:

public class Client
{
public int ClientID { get; set; }
public string Name { get; set; }
public string DCCode { get; set; }
public string CountryName { get; set; }
}

мой список трюм 4 шт ClientID и name поля заполняются, Мой список B Держите тот же 4 пункта, но нет имени и держать ClientID DCCode и CountryName мне нужно либо список обновления DCCode и Countryname с соответствующими значениями в списке B или создать список C, в котором он содержит 4 элемента с полным значением списка A и B вместе.: CL: item 1: ClientID: 1, Name: XXYY, DCCode: 4, CountryName: UK

Я могу сделать это, используя для цикла, но я пытался использовать LINQ, я пробовал следующие коды, но я не мог найти правильный способ получить результат, я хочу Решение 1

Clients1.Where(i => Clients2.Any(a=> i.CLinetID == a.CLinetID))

Решение 2:

Clients1.Concat(Clients1).Concat(Clients2).ToList();

Любая помощь будет приветствоваться

Лучший ответ:

Поскольку у вас есть поле ClientID заполненное в обоих списках, соединяет их с этим свойством и проектирует новый объект, заполненный всеми полями:

var result = from c1 in Clients1
             join c2 in Clients2 on c1.ClientID equals c2.ClientID
             select new Client { ClientID = c1.ClientID, Name = c1.Name, DCCode = c2.DCCode, CountryName = c2.CountryName };

Это создаст третий список. Вы также можете обновить элементы Clients1 аналогично:

foreach (var c1 in Clients1)
{
    var c2 = Clients2.FirstOrDefault(i => i.ClientID == c1.ClientID);
    if(c2 != null)
    {
        c1.DCCode = c2.DCCode;
        c1.CountryName = c2.CountryName;
    }
}

Ответ №1

Для обновления объектов в первом списке вы можете создать словарь из второго списка — это позволит вам быстро найти соответствующий объект с помощью O (1):

var clientsByID = listB.ToDictionary(c => c.ClientID);

foreach(var clientA in listA)
{
var clientB = clientsByID[clientA.ClientID];
clientA.DCCode = clientB.DCCode;
clientA.CountryName = clientB.CountryName;
}

Вы также можете присоединиться к двум спискам в свойстве ClientID и создать новый список из результатов (если перечисление полезно для вас, тогда я бы пошел с синтаксисом запроса):

var listC = listA.Join(listB,
a => a.ClientID,
b => b.ClientID,
(a,b) => new Client {
ClientID = a.ClientID,
Name = a.Name,
DCCode = b.DCCode,
CountryName = b.CountryName
}).ToList();

Оцените статью
TechArks.Ru
Добавить комментарий