我有两个自定义列表。
public class Model1
{
public string EmpGuid { get; set; }
public string EmployeeName { get; set; }
public DateTime Birthdate { get; set; }
}
public class Model2
{
public string EmpGuid { get; set; }
public string EmployeeName { get; set; }
public DateTime Anniversary{ get; set; }
}
现在我从这些类创建2个列表,如下所示: -
var List1 = new List<Model1>();
var List2 = new List<Model2>();
在我的Model类中,EmpGuid的值是唯一的,在两个列表中都是相同的。现在我想创建一个具有以下属性的单个类
public class Model3
{
public string EmpGuid { get; set; }
public string EmployeeName { get; set; }
public DateTime Birthdate { get; set; }
public DateTime Anniversary{ get; set; }
}
这里我要结合两个列表即。 List1和List 2将它们与EmpGuid分组,这样我就有了一个List类型列表,其中我有每个EmpGuid的生日和周年纪念日。
最终输出应为: -
修改
List 1 - EmpGuid - abc
EmpName - emp1
Birthday - something
EmpGuid - xyz
EmpName - emp2
Birthday - something2
List 2 - EmpGuid - abc
EmpName - emp1
Anniversary - somethingAnniversary
EmpGuid - mno
empName - emp3
Anniversary - somethingAnniversary3
List3 - EmpGuid - abc
EmpName - emp1
Birthday - something
Anniversary - somethingAnniversary
EmpGuid - xyz
EmpName - emp2
Birthday - something2
Anniversary - null
EmpGuid - mno
EmpName - emp3
Birthday - null
Anniversary - somethingAnniversary3
我怎样才能做到这一点?
感谢任何帮助
答案 0 :(得分:2)
您可以使用LINQ的Join
方法执行此操作:
var List3 = List1.Join(List2, l1 => l1.EmpGuid, l2 => l2.EmpGuid,
(l1, l2) => new Model3 {
EmpGuid = l1.EmpGuid,
EmployeeName = l1.EmployeeName,
BirthDate = l1.BirthDate,
Anniversary = l2.Anniversary}).ToList();
这通过比较EmpGuid
来组合两个列表,并为每个组合创建一个新的Model3
实例。
一个问题是你说EmployeeName
可能不同,所以你必须决定你选择哪一个或者你如何组合它们。
不幸的是LINQ中没有完全外连接,所以你需要手动更多一点。一种可能性是在上述查询之后添加缺少的元素,如下所示:
List3.AddRange(List1.Where(l1 => List2.All(l2 => l1.EmpGuid != l2.EmpGuid)
.Select(l1 => new Model3 {
EmpGuid = l1.EmpGuid,
EmployeeName = l1.EmployeeName,
BirthDate = l1.BirthDate,
Anniversary = null}));
和反过来相同:
List3.AddRange(List2.Where(l2 => List1.All(l1 => l1.EmpGuid != l2.EmpGuid)
.Select(l2 => new Model3 {
EmpGuid = l2.EmpGuid,
EmployeeName = l2.EmployeeName,
Anniversary = l2.Anniversary}));
这会从一个列表中获取所有未在第二个列表中出现的GUID的元素,并创建相应的Model3
个实例。 (请注意,DateTime
是值类型,不能为null,默认情况下为DateTime.MinValue
)。
答案 1 :(得分:2)
您将在两个列表上进行连接,类似于SQL:
var result = from m1 in list1
join m2 in list2 on m1.EmpGuid == m2.EmpGuid
select new Model3 { EmpGuid = m1.EmpGuid, EmployeeeName = m1.EmployeeName ...};
然而,这将总是使用EmployseeName
中的Model1
。如果要选择这两个名称,可以使用此方法;
var result = from m1 in list1
join m2 in list2 on m1.EmpGuid == m2.EmpGuid
select new Model3
{
EmpGuid = m1.EmpGuid,
EmployeeeName1 = m1.EmployeeName,
EmployeeeName2 = m2.EmployeeName,
...
};
另请查看MSDN。