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

时间:2014-11-04 21:05:36

标签: c# linq

我有一个包含一些属性的列表:

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

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

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

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

是否可以通过linq依赖于Ids来填充list1中的属性名称和list2中的Name? 我尝试过类似的东西,但它不起作用。我只能将名称输入数组或(新)列表,但不能获取list1。

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

或者这个 - 但是新子句有问题所以我无法再将它保存到list1。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您拥有的方法是可行的,但请注意,枚举项是惰性评估的。您的代码设置了一个可枚举的序列,但实际上并没有逐步执行枚举 - 因此,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;
    });