C# 基于条件将list1属性复制到list2

C# 基于条件将list1属性复制到list2,c#,linq,C#,Linq,我有一个带有一些属性的列表: public class Class1 { public int Id; public string Name; } List<Class1> list1 = GetSomeData() 或者这个-但是new子句有一个问题,所以我无法再次将其保存到列表1 (from l1 in list1 join l2 in list2 on l1.Id equals l2.Id select new { l1.Name =

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

public class Class1
{
    public int Id;
    public string Name;
}
List<Class1> list1 = GetSomeData()
或者这个-但是new子句有一个问题,所以我无法再次将其保存到列表1

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

感谢您的帮助

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

强制枚举的一种方法是在语句末尾添加
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;
    });
list1.Join(list2,
        l2 => l2.Id,
        l1 => l1.Id,
        (l1, l2) => { l1.Name = l2.Name; return l1.Name; })
        .ToList();
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;
    });