根据条件将list1属性复制到list2

本文关键字:复制 list2 属性 list1 条件 | 更新日期: 2023-09-27 18:29:01

我有一个带有一些属性的列表:

public class Class1
{
    public int Id;
    public string Name;
}
List<Class1> list1 = GetSomeData()

在这个步骤之后,我已经填写了列表1中的所有Id,但名称为空。我还有第二个列表,其中填充了这样的值:

public class Class2
{
    public int Id;
    public string Name;
}
List<Class2> list2 = GetSomeData()

所以list2已经填充了Id和Names-Id与list1相同,但当然是在其他索引上。

是否可以根据Id到linq,用list2中的name填充list1中的属性名称?我试过这样的东西,但不起作用。我只能将Names添加到数组或(新)列表中,但不能添加到list1中。

list1.Join(list2,
            l2 => l2.Id,
            l1 => l1.Id,
            (l1, l2) => { l1.Name = l2.Name; return l1.Name; });

或者这个-但新条款有问题,所以我无法再次将其保存到列表1中。

(from l1 in list1
    join l2 in list2
    on l1.Id equals l2.Id
    select new { l1.Name = l2.Name });

感谢的帮助

根据条件将list1属性复制到list2

您的方法是可行的,但请注意,枚举值是惰性求值的。您的代码设置了一个可枚举序列,但实际上并没有遍历枚举——因此,setter永远不会被调用。

强制枚举的一种方法是在语句末尾添加ToList()

list1.Join(list2,
        l2 => l2.Id,
        l1 => l1.Id,
        (l1, l2) => { l1.Name = l2.Name; return l1.Name; })
        .ToList();

这似乎有违直觉,但您的方法也有点非正统——通常这样更改枚举块内的属性可能是不明智的。我认为使用ForEach迭代器来设置属性会更好(更清晰、更安全,即使有点冗长):

list1.Join(list2,
        l2 => l2.Id,
        l1 => l1.Id,
        (l1, l2) => new { l1 = l1, l2 = l2 })
    .ToList()
    .ForEach(x => {
        x.l1.Name = x.l2.Name;
    });