使用其他对象列表组合构建新的Object列表

时间:2017-11-03 10:39:19

标签: c# list linq

我有两个客户端对象列表:

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

我的列表A保留4个项目ClientID,并填充name个字段, 我的列表B保留相同的4个项目但没有名称并按住ClientID DCCodeCountryName 我需要使用列表B中的相应值更新列表A DCCodeCountryname 或创建列表C,它包含4个项目,列表A和B的完整值 喜欢 : 列表C L:第1项:ClientID:1,名称:XXYY,DCCode:4,CountryName:UK

我可以使用for循环执行此操作,但我一直在尝试使用LINQ 我尝试了以下代码,但我找不到正确的方法来获得我想要的结果 解决方案1 ​​

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

解决方案2:

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

欢迎任何帮助

2 个答案:

答案 0 :(得分:1)

正如您在两个列表中填充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 :(得分: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();