假设列表中的项目数量较少,并且列表 1 中只有一项匹配:
list2.ForEach(l2m => list1.First(l1m => l1m.Name == l2m.Name).Target = l2m.Target);
如果 List1 中有多个项目必须更新,请枚举整个 list1,对 list2 执行 First。
list1.ForEach(l1m => l1m.Target = list2.FirstOrDefault(l2m => l1.Name == l2m.Name)?.Target ?? l1m.Target);
如果list2中有大量项目,将其变成字典
var d = list2.ToDictionary(m => m.Name);
list1.ForEach(m => m.Target = d.ContainsKey(m.Name) ? d[m.Name].Target : m.Target);
(推测list2不包含任何重复的名称)
如果 list1 的名称是唯一的,并且 list2 中的所有内容都在 list1 中,您甚至可以将 list1 转换为字典并枚举 list2:
var d=list1.ToDictionary(m => m.Name);
list2.ForEach(m => d[m.Name].Target = m.Target);
如果列表 2 包含不在列表 1 中的条目或列表 1 有重复的名称,您可以使用查找来代替,您只需执行一些操作以避免出现“集合已修改;枚举可能无法执行”的情况,如果您这样做试图修改它响应名称而返回的列表
mapList1.Where(m1 => pathsList2.Where(m2 => m1.Name == m2.Name) ) // 不知道下一步该做什么
LINQWhere 并不是真的那样工作/它本身不是一个语句。 m1 是 list1 中的条目,内部Where将生成列表2项的可枚举,但它不会产生外部Where所期望的布尔值,也不能对任何一个序列执行任何操作,因为LINQ操作是不应该有副作用。您可以使用Where 做的唯一事情是捕获或使用它在其他操作(例如枚举它)中返回的序列,因此Where 并不是您真正用于此操作的东西,除非您使用它来查找所有对象你需要改变。可能值得指出的是,ForEach 是一个列表事物,而不是 LINQ 事物,并且基本上只是另一种编写方式foreach(var item in someList)