将2个列表与具有共同对象值c#

时间:2016-08-11 09:24:58

标签: c# list dictionary model

我有两个自定义列表。

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

我怎样才能做到这一点?

感谢任何帮助

2 个答案:

答案 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