根据id将对象列表从一个列表复制到另一个列表

时间:2015-09-03 02:20:44

标签: c# list foreach lambda

基本上我有两个对象列表。我需要做一些事情,比如根据列表之间匹配的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();
    }
}

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题。首先从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();

答案 1 :(得分:0)

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

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