LINQ Group и считать с Максом

Может кто-нибудь написать запрос LINQ для следующего, пожалуйста

Учитывая приведенные ниже данные, мне нужен следующий игрок с наибольшим количеством очков каждую неделю и подсчет их, если они выиграют более одной недели. Если ничья приводит к наибольшему количеству очков за неделю, то каждый игрок получает счет один. Данные примера включают эту ситуацию

Week   Player         Points 
1      Steve            35 
1      Mark             29 
1      John             26 
2      John             23 
2      Mark             21 
2      Steve            21 
3      Mark             42 
3      John             42 
3      Steve            19 
4      Pete             28 
4      John             16 
4      Steve            14 
4      Mark             12 

Результат будет

Player         Count
Steve            1
John             2
Mark             1
Pete             1

1 ответ

Решение

Я, вероятно, разбил бы это на два этапа - что на самом деле не означает, что что-либо выполняется раньше, но это проще для понимания.

// For each week, yield a sequence of winning results
var winningResultsByWeek = from result in results
                           group result by result.Week into week
                           let winningScore = week.Max(x => x.Points)
                           select week.Where(x => x.Points == winningScore)

var winsPerPlayer = from winningResults in winningResultsByWeek
                    from winningResult in winningResults
                    group winningResult by winningResult.Player into winsByPlayer
                    select new { Player = winsByPlayer.Key,
                                 Count = winsByPlayer.Count() };

Присвоение имен здесь очень важно - надеюсь, изложив все, я сделал это достаточно ясно. Я уверен, что есть и другие способы сделать это, конечно, но это самый ясный способ, о котором я думал.

Другие вопросы по тегам