C#从另一个列表中更新列表

我有2个List 。 第一个,让我们称之为ListA更像是一个完整的列表,第二个ListB是一个修改过的列表。 现在我想要做的是用ListB修改ListA。 这是可行的,我该怎么做。 这是我到目前为止但不起作用:

 var ListB = _repository.Get(m => m.Approved == true).ToList(); foreach (var x in ListB) { ListA.Where(d => d.Name == x.Name).First() = x; } return ListA; 

编辑:视觉演示描述“修改”在我的情况下意味着什么

 ListA Id Name Age 1 John 14 2 Mark 15 3 Luke 13 4 Matthew 18 ListB Id Name Age 2 Mark 0 4 Matthew 99 

“修改”后,ListA应如下所示:

 ListA Id Name Age 1 John 14 2 Mark 0 3 Luke 13 4 Matthew 99 

我认为,您只想更新一个年龄。 此外,您不需要使用Where().First()您可以只使用First()

 foreach (var x in ListB) { var itemToChange = ListA.First(d => d.Name == x.Name).Age = x.Age; } 

如果您不确定, ListA存在ListA ,则应使用FirstOrDefault()和if语句进行检查。

 foreach (var x in ListB) { var itemToChange = ListA.FirstOrDefault(d => d.Name == x.Name); if (itemToChange != null) itemToChange.Age = x.Age; } 

Where和First返回IEnumerable – 您只能修改列表的节点,但不能重新分配。

选项0 – 通用方法

 using System.Collections.Generic; //... var itemToUpdate = ListA.FirstOrDefault(d => d.Name == x.Name); if (itemToUpdate != null) { ListA[ListA.IndexOf(itemToUpdate)] = x; } 

选项1 – 实施更新方法或手动执行字段更新

 ListA.First(d => d.Name == x.Name).Update(x); 

详细说明aershov的答案:

 ListA.Where(d => d.Name == x.Name).First().CopyFrom(x); 

然后在你的Person类中:

 public class Person { // ... Name, Id, Age properties... public void CopyFrom(Person p) { this.Name = p.Name; this.Id = p.Id; this.Age = p.Age; } } 

当然检查空值和一切。

您可以根据IdListA删除ListB所有元素,将ListB添加到ListA ,然后使用Id进行排序。

 var newlist = ListA.Where(s => !ListB.Any(p => p.Id == s.Id)).ToList(); newlist.AddRange(ListB); ListA = newlist.OrderBy(o => o.Id).ToList(); 

您还可以将Union方法与IEqualityComparer一起使用:

 var newList = ListB.Union(ListA, new PersonEqualityComparer()); class PersonEqualityComparer : IEqualityComparer { public bool Equals(Person person1, Person person2) { if (person1 == null && person2 == null) return true; else if ((person1 != null && person2 == null) || (person1 == null && person2 != null)) return false; return person1.Id.Equals(person2.Id); } public int GetHashCode(Person item) { return item.Id.GetHashCode(); } }