Объединить два списка 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();