2010-09-27 2 views
0

У меня есть класс, который содержит номера игроков ...Определение игрока, который играл большинство игр

public class Game { 
    public int blackPlayer { get; set; } 
    public int whitePlayer { get; set; } 
} 

и ...

List<Game> games; 

Я хочу знать, какой номер игрока происходит большинство в списке (независимо от того, играют ли они черные или белые). Кто-нибудь знает хорошее выражение LINQ?

+0

Помимо вашего первоначального вопроса, я считаю, что ваши схемы именования очень сбивают с толку. Мне потребовалось некоторое время, чтобы понять, что * черный * на самом деле означает * playerNumberWhoWasBlack *. –

+0

Я изменил 'черный' и 'белый' на 'blackPlayer' и 'whitePlayer'. – Protagonist

+0

может ли белый и черный проигрыватель быть одинаковым? – Francisco

ответ

5

Следующие должны отпишусь:

var q = (from g in games 
     from p in new[] {g.blackPlayer, g.whitePlayer} 
     group p by p into pgroup 
     orderby pgroup.Count() descending 
     select new { Player = pgroup.Key, Count = pgroup.Count() }).FirstOrDefault(); 


Console.WriteLine("Player # {0} played {1} times which is the most", q.Player, q.Count); 
1

Если вы хотите, чтобы все связи.

List<int> mostFrequentPlayers = games.Select(g => g.blackPlayer) 
    .Concat(games.Select(g => g.whitePlayer)) 
    .GroupBy(p => p) //into g 
    .GroupBy(g => g.Count()) //into g2 
    .OrderByDescending(g2 => g2.Key) 
    .First() 
    .SelectMany(g2 => g2, g => g.Key) //unpack g2 as g.Key 
    .ToList(); 
Смежные вопросы