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; } }
当然检查空值和一切。
您可以根据Id
从ListA
删除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(); } }