2009-08-12 36 views
6

Tôi có Danh sách từ điển có khóa của chuỗi kiểu và giá trị là int.Làm cách nào để tìm giá trị tối đa cho mỗi khóa trong Danh sách Từ điển bằng LINQ?

Nhiều từ điển có khóa giống nhau nhưng không phải tất cả các khóa đó.

Vì vậy, câu hỏi của tôi là: sử dụng LINQ làm cách nào để tìm giá trị tối đa được liên kết với mỗi khóa riêng biệt trên tất cả các từ điển?

Vì vậy, ví dụ cho các đầu vào sau:

var data = new List<Dictionary<string, int>> 
{ 
    new Dictionary<string, int> {{"alpha", 4}, {"gorilla", 2}, {"gamma", 3}}, 
    new Dictionary<string, int> {{"alpha", 1}, {"beta", 3}, {"gamma", 1}}, 
    new Dictionary<string, int> {{"monkey", 2}, {"beta", 2}, {"gamma", 2}}, 
}; 

Tôi muốn một số loại bộ sưu tập có chứa:

{"alpha", 4}, 
{"gorilla", 2}, 
{"gamma", 3}, 
{"beta", 3}, 
{"monkey", 2} 

(tôi đang lặp qua danh sách và theo dõi các điều bản thân mình, thực sự chỉ cần tự hỏi nếu có một cách LINQ-esque đẹp hơn để làm điều đó)

EDIT: Tôi cũng không biết những gì các phím chuỗi trước

Trả lời

9
var results = data.SelectMany(d => d) 
        .GroupBy(d => d.Key) 
        .Select(g => new 
{ 
    GroupName = g.Key, 
    MaxValue = g.Max(i => i.Value) 
}); 

và để kiểm tra trên, sử dụng này

foreach (var item in results) 
{ 
    Console.WriteLine(item); 
} 

để có được kết quả như sau ...

{ GroupName = alpha, MaxValue = 4 } 
{ GroupName = gorilla, MaxValue = 2 } 
{ GroupName = gamma, MaxValue = 3 } 
{ GroupName = beta, MaxValue = 3 } 
{ GroupName = monkey, MaxValue = 2 } 
+0

Marvelous! Tại sao nó luôn luôn rõ ràng như vậy khi bạn nhìn thấy nó :-) – Argos

+3

Có, tất nhiên, nhiều cách khác để làm điều tương tự: 'data.SelectMany (d => d) .GroupBy (d => d.Key, d => d.Value, (k, i) => mới {GroupName = k, MaxValue = i.Max()}) 'hoặc' từ d trong dữ liệu.SelectMany (i => i) nhóm d.Value by d .Nhập vào g chọn {GroupName = g.Key, MaxValue = g.Max()} mới là hai trong số chúng. –

Các vấn đề liên quan