【问题标题】:Copy list1 property to list2 based oncondition根据条件将 list1 属性复制到 list2
【发布时间】:2014-11-04 21:05:36
【问题描述】:

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

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

在这一步之后,我已经填写了 list1 中的所有 Id,但 Names 为空。我还有第二个列表,这些值是这样填充的:

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

所以 list2 已经填充了 ID 和名称 - ID 与 list1 相同,但当然在另一个索引上。

是否可以通过 linq 使用来自 list2 的名称来填充 list1 中的属性名称,这取决于 Ids? 我已经尝试过这样的事情,但它不起作用。我只能将名称添加到数组或(新)列表中,但不能添加到 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 });

感谢帮助

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

    强制枚举的一种方法是将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;
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2020-09-26
      • 2021-04-27
      相关资源
      最近更新 更多