如何解决通过同一ID将一个列表中的属性添加到另一个列表中
有没有办法使此代码更简洁,当列表具有相同的ID时,我试图将一个列表的属性复制到另一列表。
感谢您的帮助。
/*Parameters*/
List < Model1 > List1,<Model2 > List2
List < Model1 > newList = new List < Model1 > ();
foreach(Model1 list1 in List1) {
foreach(Model2 list2 in List2) {
if (list1.ID == list2.ID) {
list1.Attribute = list2.Attribute;
}
}
newList.Add(list1);
}
return newList;
解决方法
您的代码有什么问题?如果它已经被某种方法包装了,我看不到您所拥有的问题。我会发表评论而不是回答,但是您需要的代表比我需要的更多。
如果您认为适合的话,可以将其设置为extension
//Put this in a static class
public static List<Model1> CopyAttributes(this List<Model1> list1,List<Model2> list2) {
List<Model1> newlist = new List<Model1>();
foreach(Model1 item1 in list1) {
foreach(Model2 item2 in list2) {
if(item1.ID == item2.ID) {
item1.Attribute = item2.Attribute;
}
}
newlist.Add(item1);
}
return newlist;
}
编辑:这是您所要求的使用lambda的LINQ解决方案;这段代码不是最佳实践,但是您似乎要这样做。它也不会小很多,纯粹是因为您想要的东西是您的情况所独有的,并且不能被广泛推广。
List<Model1> newlist = new List<Model1>();
list1.ForEach(item1 => {
list2.ForEach(item2 => {
if(item1.ID == item2.ID) item1.Attribute = item2.Attribute;
});
newlist.Add(item1);
});
,
如果您只是想将属性复制到list1的相同项目中
public static void CopyAttributesOfMatchingItems(List<Model1> list1,List<Model2> list2)
{
foreach (var item in list1)
{
var matchingItem = list2.SingleOrDefault(i2 => i2.Id == item.Id);
if (matchingItem != null)
item.Attribute = matchingItem.Attribute;
// if Attribute is reference type,and you want an actual copy you will need to clone... item.Attribute = matchingItem.Attribute.Clone();
}
}
如果您需要将具有匹配ID的项目添加到新列表中(因为您已经在注释中提到要使用Lambda表达式)。
public static List<Model1> CopyItemsToNewList(List<Model1> list1,List<Model2> list2)
{
List<Model1> newList = new List<Model1>();
newList.AddRange(list1.Where(i1 => list2.Any(i2 => i2.Id == i1.Id) ));
return newList;
}
注意:从这个问题尚不清楚,是要将同一个对象添加到新列表中,还是要将对象的实际副本添加到新列表中。对于前者,您会很好用;对于后者,您将需要使用一种方法来克隆该对象并将克隆添加到列表中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。