Объединить два списка List - C#
Формулировка задачи:
Всем привет!
Возникла задача объединения двух типизированных списков по полю (id), но с подвохом.
Есть класс ClientStatus с некоторым набором полей,
также есть общий список экземпляров ClientStatus, в котором заполнены только ClientStatusID и имя ClientStatusName,
и наконец есть детализированный список экземпляров того же класса, в котором имя ClientStatusName не указано:
Собственно, задача в том, чтобы объединить эти два списка по полю ClientStatusID с сохранением всех заполненных полей и получить список вида:
Пока моё совсем неэлегантное решение выглядит так:
Прошу уважаемое сообщество указать правильный путь для решения такой тривиальной задачи.
С уважением, Денис.
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 = 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д