我有这样的代码。
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进行操作。请帮帮我!
答案 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)
});
请注意,如果采用这种方法,Name
或NickName
来自哪个表无关紧要:您可以在列表中混合分配,让LINQ为您重新组合。< / p>