2010-06-04 35 views
8

Chỉ cần nhận được đầu của tôi xung quanh Linq và có rất nhiều niềm vui! bất cứ ai có thể giúp tôi với một truy vấn cho việc này:
Tôi có một danh sách các dữ liệu: LINQ: Chọn các mục từ danh sách (Nhóm theo/Chọn/Tổng & Tối đa!)

 
    Key Value 
    Aaa 12 
    AaA 10 
    AAa 5 
    BBB 2 
    Bbb 1 
1. Tôi muốn nhóm bởi Key.ToUpper()
2. Đối với mỗi nhóm I cần Max (Value) & Sum (giá trị)
3. Đối với mỗi nhóm tôi muốn chọn các mục có những value = Max (giá trị)
kết quả cuối cùng sẽ như thế này:!
 
    Key Max Total 
    AaA 12 27 
    AAa 12 27 
    Bbb 2 3
Cảm ơn!

Update, thực sự tôi cũng cần Key từ sự xâm nhập tối đa:

 
    Key Max Total Correct 
    AaA 12 27 Aaa 
    AAa 12 27 Aaa 
    Bbb 2 3  BBB

+3

Nghe có vẻ nghi ngờ như bài tập về nhà. –

+0

Hoặc một câu hỏi phỏng vấn ... bài tập về nhà thường không liên quan đến "ToUpper" –

+0

Không có chaps, bạn sẽ thấy từ hồ sơ của tôi rằng tôi là một chút bài tập về nhà :) Và không thực sự là một coder chuyên nghiệp [nữa], chỉ cho vui :) –

Trả lời

16

:)

var results = 
    from kvp in source 
    group kvp by kvp.Key.ToUpper() into g 
    select new 
    { 
    Group = g, 
    Max = g.Max(kvp => kvp.Value), 
    Total = g.Sum(kvp => kvp.Value) 
    } into ag 
    from x in ag.Group //SelectMany 
    where x.Value != ag.Max 
    //for the update to the question - note: possibly ambiguous 
    let correct = ag.Group.Where(y => y.Value == ag.Max).First().Key 
    select new 
    { 
    Key = x.Key, 
    Max = ag.Max, 
    Total = ag.Total, 
    Correct = correct 
    }; 

Tôi kinda như câu hỏi vì tất cả các phần nhỏ (một số ít được sử dụng) được cần thiết để đưa ra câu trả lời.


Max = g.Max(kvp => kvp.Value), 
Total = g.Sum(kvp => kvp.Value) 

Performing nhiều quy tụ vào một nhóm là đơn giản, nhưng đầy thử thách nếu bạn không biết làm thế nào.


select a into b 

khoản này có tất cả những gì xảy ra trước đây và bắt đầu một truy vấn mới với mục tiêu. Nếu không có nó, tôi sẽ phải bắt đầu một truy vấn mới như thế này:

var A = ... select a 

var B = from b in A 

Điều quan trọng cần lưu ý là mệnh đề select into loại bỏ kvpg từ phạm vi.


from b in source 
    from a in b.A //SelectMany 

này "giải nén" của bộ sưu tập trẻ hóa truy vấn của tôi về của b vào một truy vấn về một. Không giống như quá tải Enumerable.SelectMany mặc định, nó rời khỏi bố mẹ (b) trong phạm vi.


where x.Value != ag.Max 

So sánh tài sản của một đứa trẻ với tài sản của cha mẹ? Thú vị. Điều quan trọng cần nhớ là phải chia ra where bất kỳ lúc nào bạn muốn lọc, ngay cả khi bạn vừa nhóm (không có HAVING).

+0

Wowsers, câu trả lời nhanh & hoàn hảo. Cám ơn! –

+0

Vui vì tôi có thể cù các phần được sử dụng ít hơn của LINQ. Tôi nghĩ rằng việc bổ sung nhỏ làm cho nó hơi phức tạp hơn? –

+0

Đã cập nhật. Sự mơ hồ xuất phát từ khả năng nhiều hàng có thể có cùng giá trị tối đa. Ngoài ra tôi muốn đề cập rằng nếu tất cả các hàng cho một khóa nhất định có cùng giá trị, thì không có hàng nào được trả về. –

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