更新列表中的属性字段

2023-12-21

我有一个List<Map>我想更新Map.Target基于另一个匹配值的属性List<Map>.

基本上,逻辑是:

If mapsList1.Name is equal to mapsList2.Name
    Then mapsList1.Target = mapsList2.Name

的结构Map类看起来像这样:

public class Map {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Target { get; set; }
}

我尝试了以下方法,但显然它不起作用:

List<Map> mapsList1 = new List<Map>();
List<Map> mapsList2 = new List<Map>();
    
// populate the 2 lists here
    
mapsList1.Where(m1 => mapsList2.Where(m2 =>  m1.Name == m2.Name) ) // don't know what to do next

列表 1 中的项目数始终大于或等于列表 2 中的项目数。两个列表中都没有重复项。


假设列表中的项目数量较少,并且列表 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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新列表中的属性字段 的相关文章

随机推荐