我有两个客户端对象列表:
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
DCCode
和CountryName
我需要使用列表B中的相应值更新列表A DCCode
和Countryname
或创建列表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();
欢迎任何帮助
答案 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();