2017-09-07 61 views
1

我有兩個包含對象的列表。它們的長度相同。每個對象都有一個ID(在兩個列表中都有),一個更改日期和一些數據。我想使用相同的ID創建一個新列表,但使用更新的更改日期的對象,並使用高效的Linq語句。Linq根據內容從兩個列表中選擇對象

實施例:

列表1:

ID: 1 ChangeDate 12:00 Data 1:1 
ID: 2 ChangeDate 13:00 Data 1:2 <- 
ID: 3 ChangeDate 14:00 Data 1:3 

列表2:

ID: 1 ChangeDate 12:05 Data 2:1 <- 
ID: 2 ChangeDate 12:55 Data 2:2 
ID: 3 ChangeDate 14:10 Data 2:3 <- 

結果:

ID: 1 ChangeDate 12:05 Data 2:1 
ID: 2 ChangeDate 13:00 Data 1:2 
ID: 3 ChangeDate 14:10 Data 2:3 

乾杯

+0

是兩個列表相同的順序? –

+0

訂單並不總是相同的。 – Bagaboo

回答

1

如果我們假設你有一個包含你所提到的名單列表:

var input = new List<Item> { list1, list2 }; 

其中Item它是list1list2包括對象的類型。

你可以嘗試以下方法:

var output = input.SelectMany(x=>x) 
        .GroupBy(x=>x.ID) 
        .Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First()); 

本質上講,我們項目的所有從一個列表列表中的elemnts,然後我們集團根據其ID的項目。然後從每個組中挑選最近的記錄。

如果我們只有列表中,我們可以將它們連接起來:

var input = list1.AddRange(list2); 

,然後嘗試以下操作:

var output = input.GroupBy(x=>x.ID) 
        .Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First()); 
+0

優秀和優雅。謝謝! – Bagaboo

+0

@Bagaboo歡迎您! – Christos

+0

而不是將兩者都放在一個額外的輸入列表中,你可以用'list1.Union(list2)'替換'input.SelectMany(x => x)'。 – Jeremi

相關問題