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

标签 c# linq

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

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 根据 ID 将 list1 中的属性名称填充为 list2 中的名称? 我试过这样的东西,但它不起作用。我只能将名称获取到数组或(新)列表,但不能获取列表 1。

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 });

感谢帮助

最佳答案

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

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

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

这看起来确实违反直觉,但您的方法也有点不正统——像那样更改枚举 block 内的属性通常可能是不明智的。我认为使用 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;
    });

关于c# - 根据条件将 list1 属性复制到 list2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745013/

相关文章:

c# - 多个 MDF 文件 VS 单个数据库(SQL Server)

c# - C# WinForms 应用程序中未发生预期的跨线程异常

c# - 在 .NET 应用程序中显式导致 AccessViolationException

c# - 我们如何使用 LINQ 从 asp.net mvc3 中的长字符串中提取短字符串?

c# - Linq 集团月度季度

c# - 如何在单元测试期间覆盖 IQueryable 的 Contains 方法?

c# - 如何将 Blazor WebAssembly 连接到数据库

c# - 如何将 Excel 文件保存在特定文件夹中

c# - 将 double 与自适应近似相等进行比较

.net - 用于短语的 LINQ2SQL LIKE 命令