Объединить два списка List - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Возникла задача объединения двух типизированных списков по полю (id), но с подвохом. Есть класс ClientStatus с некоторым набором полей, также есть общий список экземпляров ClientStatus, в котором заполнены только ClientStatusID и имя ClientStatusName, и наконец есть детализированный список экземпляров того же класса, в котором имя ClientStatusName не указано:
public class ClientStatus
{
  public int ClientStatusID { get; set; }
  public string ClientStatusName { get; set; }
  public object ClientID { get; set; }
  public int Vat { get; set; }
  public object SexID { get; set; }
}
//общий список вида id-название
var commonlist = new List<ClientStatus>()
{
  new ClientStatus() {ClientStatusID = 1, ClientStatusName = "ВИП"},
  new ClientStatus() {ClientStatusID = 2, ClientStatusName = "Специальный"},
  new ClientStatus() {ClientStatusID = 3, ClientStatusName = "Поставщик"},
  new ClientStatus() {ClientStatusID = 4, ClientStatusName = "Стандартный"}
}
//детализированный список без названий
var selectedlist = new List<ClientStatus>()
{
   new ClientStatus() {ClientStatusID = 1, Vat = 563, ClientID = 4, SexID = "m"},
   new ClientStatus() {ClientStatusID = 3, Vat = 125, ClientID = 12, SexID = "f"}
};
Собственно, задача в том, чтобы объединить эти два списка по полю ClientStatusID с сохранением всех заполненных полей и получить список вида:
{ClientStatusID = 1, ClientStatusName = "ВИП", Vat = 563, ClientID = 4, SexID = "m"},
{ClientStatusID = 2, ClientStatusName = "Специальный"},
{ClientStatusID = 3, ClientStatusName = "Поставщик", Vat = 125, ClientID = 12, SexID = "f"},
{ClientStatusID = 4, ClientStatusName = "Стандартный"}
Пока моё совсем неэлегантное решение выглядит так:
//сначала пересекаю списки по ClientStatusID и создаю новый со значениями из обоих
var selectedNamedList = (from com in commonlist
                         from sel in selectedlist
                         where com.ClientStatusID == sel.ClientStatusID
                         select
                           new ClientStatus()
                           {
                              ClientStatusID = sel.ClientStatusID,
                              ClientStatusName = com.ClientStatusName,
                              ClientID = sel.ClientID,
                              Vat = sel.Vat,
                              SexID = sel.SexID
                           }
                         ).ToList();
//затем объединяю получившийся список полноценных записей с общим списком, 
//используя наколхозенный Comparer
var unitedList = 
     selectedNamedList.Union(commonlist, new ClientStatusComparer()).ToList();
 
//ClientStatusComparer сравнивает записи только по одному полю ClientStatusID
class ClientStatusComparer : IEqualityComparer<ClientStatus>
{
   public bool Equals(ClientStatus x, ClientStatus y)
   {
      return x.ClientStatusID == y.ClientStatusID;
   }
   public int GetHashCode(ClientStatus сlientStatus)
   {
      if (Object.ReferenceEquals(сlientStatus, null)) return 0;
      int hashСlientStatusCode = сlientStatus.ClientStatusID.GetHashCode();
      return hashСlientStatusCode;
   }
}
Прошу уважаемое сообщество указать правильный путь для решения такой тривиальной задачи. С уважением, Денис.

Решение задачи: «Объединить два списка List»

textual
Листинг программы
var unitedList = (from com in commonList
                       join w in selectedList on com.ClientStatusId equals w.ClientStatusId into t in sel from t.DefaultIfEmpty()
                      select new ClientStatus(){
                            ClientStatusId = com.ClientStatusId,
                            ClientStatusName = com.ClientStatusName,
                            ClientId = sel.ClientId,
                            Vat = sel.Vat,
                            SexId = sel.SexId
                      }).ToList();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5