2010-02-19 37 views
9

Tôi có hai danh sách đối tượng, sử dụng LINQ Tôi muốn hợp nhất chúng, nhưng khi hai danh sách chứa đối tượng có cùng khóa, tôi chỉ muốn một đối tượng có Giá trị LastUpdated lớn nhất.Sử dụng LINQ để hợp nhất một danh sách các đối tượng

Tôi nghĩ rằng tôi bằng cách nào đó có thể nhận được một nhóm danh sách bằng một phím với max (LastUpdated) sau đó tham gia trở lại danh sách tham gia vào quan trọng và LastUpdated, nhưng phải có một cách hiệu quả hơn ...

List<MyObject> lstListA = new List<MyObject>; 
List<MyObject> lstListB = new List<MyObject>; 

public class MyObject 
{ 
    public string Key {get;set;} 
    public string Value {get;set;} 
    public DateTime LastUpdated {get;set;} 
} 

Trả lời

17

Một lựa chọn, sử dụng DistinctBy từ MoreLINQ:

var query = lstListA.Concat(lstListB) 
        .OrderByDescending(x => x.LastUpdated) 
        .DistinctBy(x => x.Key); 
+0

DistinctBy khác biệt như thế nào khi sử dụng Khác biệt với bộ so sánh? Kết quả sẽ giống nhau không? – Jeremy

+0

@Jeremy: Có, kết quả là như nhau - DistinctBy chỉ đơn giản là dễ dàng hơn :) –

0

Một chút comvoluted, nhưng điều này dường như làm việc cũng như:

var mergedItems = lstListA.Concat(lstListB); 

mergedItems = 
    (from item in mergedItems 
    group item by item.Key into grp 
    let sameKey = mergedItems.Where(obj => obj.Key == grp.Key) 
    select sameKey.Where(obj => obj.LastUpdated == grp.Max(obj2 => obj2.LastUpdated)).Single() 
).ToList(); 
2

Chọn người chiến thắng cổ điển.

IEnumerable<MyObject> query = lstListA 
    .Concat(lstListB) 
    .GroupBy(x => x.Key) 
//now work with each group to pick a winner 
    .Select(g => g.OrderByDescending(x => x.LastUpdated).First()) 
Các vấn đề liên quan