2016-08-11 38 views
0

我有兩個自定義列表。組合2個具有共同對象值的列表c#

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>(); 

在我的模型類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和List2將它們與EmpGuid分組在一起,使得我有一個單一的列表類型列表,其中我有每個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 

我怎樣才能做到這一點?

任何幫助,使用LINQ的Join方法讚賞

+0

但是,如果'EmployeeName'也可以不同於你想要使用的列表? – HimBromBeere

+0

您是否嘗試過基於我們解決方案的任何事情?我們沒有爲你做所有的工作。 – HimBromBeere

+0

@HimBromBeere是Iam嘗試所有人都幫我在這裏的解決方案 –

回答

2

你可以這樣做:

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的S結合兩個列表併爲每個組合的新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,唐」 t出現在第二個列表中,並創建相應的實例Model3。 (請注意,DateTime是一個值類型,不能爲空,默認情況下爲DateTime.MinValue)。

+0

感謝您的答覆。我試過了。但是這隻給了我具有共同的EmpGuid的價值。我想包括其他人,以及哪些不常見 –

+0

請在編輯時檢查我想要的輸出 –

+0

@helloworld更新了我的答案 –

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 ...}; 

然而,這將八方通使用EmployseeNameModel1。如果你想選擇兩個名字,你可以使用這種方法;

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

+0

我通常堅持使用方法語法,但在這種情況下查詢語法看起來更好。 –

+0

@RenéVogt感覺相同 – HimBromBeere

+0

請在編輯中檢查我想要的輸出。我想從第一個名單中拿EmpNames –

相關問題