【问题标题】:Copy a list of objects from one list to another based on id根据 id 将对象列表从一个列表复制到另一个列表
【发布时间】:2015-11-28 17:15:47
【问题描述】:

基本上我有两个对象列表。我需要根据列表之间匹配的 id 属性从第二个列表更新第一个列表。如何在不使用foreach 循环的情况下实现这一点。

public class Test1
{
    int Id;
    List<Test2> Test2Values;
}

public class Test2
{
    int Test1Id;
    string valueString;
}

public class Main
{
    public void Test()
    {
        List<Test1> testList1 = GetTest1();
        List<Test2> testList2 = GetTest2();

        foreach(Test1 t in testList1)
            t.Test2Values = testList2.Where(tl => tl.Test1Id == t.Id).ToList();
    }
}

【问题讨论】:

  • foreach 是迭代现有列表的正确方法。您可以使用forList&lt;T&gt;.ForEach,但我认为这两个选项都不那么优雅。如果您正在寻找不错的 LINQ 单线,我认为它不存在。
  • 如果您有一个Id 值列表,并且您想创建 Test1 实例以及与之关联的适当Test2 实例,那么您可以用 LINQ 很好地做到这一点。
  • 是的,我知道,但我的目标是用 testList2 集中的匹配值填充现有的 testList1。
  • 什么都没有。我正在寻找是否可以进行任何“批量”操作。例如,当您进行选择时,您可以在列表之间进行连接。它们比常规的 foreach 快得多。寻找类似的东西(如果存在)。
  • 您可以使用 testList2.ToDictionary() 以 Id 作为键并将 Test2Values 作为值,这样“where”将得到优化,因为您不需要遍历整个列表来查找而不是使用字典 [ Id] 一次性获取对象。将添加一个答案。

标签: c# list foreach lambda


【解决方案1】:

使用以下代码获取两个列表之间的共同项目,然后处理下一个:

 var result = testList1.Where(p => testList2.Any(p2 => p2.Id == p.Id));

【讨论】:

    【解决方案2】:

    这应该可以解决问题。首先用testList2 构建一个字典。键入Test1Id。然后从testList1 中选择每个项目。检查它的 id 是否在字典中。如果是这样,用新值替换列表,否则保留旧值。

    var dict = testList2
                .GroupBy(t2 => t2.Test1Id)
                .ToDictionary(
                    gr => gr.Key, 
                    gr => gr.ToList());
    
    testList1
        .Select(t1 => 
        { 
            t1.Test2Values = dict.ContainsKey(t1.Id) ? dict[t1.Id] : t1.Test2Values;
            return t1;
        })
        .ToList();
    

    【讨论】:

    • 修改Select.. 中的列表。 foreach 没有问题,您已经解决了字典的性能问题。我相信它实际上也不会做任何事情,直到你把 ToList() 放在最后,这要归功于延迟执行。
    • 感谢您发现这一点。我修复了选择。至于使用Selectforeach 版本已经存在问题。然后问题是在没有foreach 的情况下获得解决方案。只需提供我被要求的内容...
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2020-11-03
    • 2012-07-21
    • 2016-11-08
    • 2011-11-26
    相关资源
    最近更新 更多