使用Linq合并到List

时间:2014-06-16 07:55:17

标签: linq merge combinations

我有这样的代码。

public class Employee
{
    public int ID { get; set; }

     public string Name { get; set; }

     public string NickName { get; set; }
}

var table1 = new List<Employee>() {
                new Employee(){ ID=1, Name="A"},
                new Employee(){ ID=2, Name="B"},
                new Employee(){ ID=3, Name="C"},
                new Employee(){ ID=5, Name="E"},
            };
var table2 = new List<Employee>() {
                new Employee(){ ID=1, NickName="NickA"},
                new Employee(){ ID=2, NickName="NickB"},
                new Employee(){ ID=3, NickName="NickC"},
                new Employee(){ ID=4, NickName="NickD"}
            };

我想将上面的两个列表合并为:

{ID=1, Name="A", NickName="NickA"}
{ID=2, Name="B", NickName="NickB"}
{ID=3, Name="C", NickName="NickC"}
{ID=4, Name=null, NickName="NickD"}
{ID=5, Name="E", NickName=null}

如何使用LinQ进行操作。请帮帮我!

2 个答案:

答案 0 :(得分:1)

类似的东西:

var results = table1.Select(t1 => {
                 var t2 = table2.First(x => x.ID == t1.ID);
                 return new Employee {
                   ID = t1.ID,
                   Name = t1.Name,
                   NickName = t2.NickName
                 };
              }).ToList();

如果table2足够大(成千上万个条目或更多)考虑(即性能测量)构建Dictionary或对数组进行排序以通过ID提供更快的查找(在后一种情况下,使用BinarySearch方法和自定义IComparer只比较ids)。设置这个中间结构的成本是非常重要的,现代计算机可以非常快速地搜索几千个简单的行。

答案 1 :(得分:1)

您可以按ID分组,并为每个字段选择“第一个”值,如下所示:

var res = table1.Concat(table2).GroupBy(e => e.ID)
    .Select(g => new Employee {
        ID = g.Key
    ,   Name = g.Select(e => e.Name).FirstOrDefault(s => s != null)
    ,   NickName = g.Select(e => NickName).FirstOrDefault(s => s != null)
    });

请注意,如果采用这种方法,NameNickName来自哪个表无关紧要:您可以在列表中混合分配,让LINQ为您重新组合。< / p>