:)
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ỏ kvp
và g
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
).
Nguồn
2010-06-04 01:06:24
Nghe có vẻ nghi ngờ như bài tập về nhà. –
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" –
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 :) –