public IEnumerable <PlayerNumber> NextMatchCandidates() { var lastDefeatedRound = Rounds .OrderByDescending(it => it.Number) .Select(it => (Round?)it) .FirstOrDefault(it => it.Value.HasDefeateds); var targetRounds = Rounds.SkipWhile(it => it.Number <= (lastDefeatedRound?.Number ?? 0)); var alivedOthers = AlivedOthers(); var recentRoundCount = 4 < alivedOthers.Count ? 4 : alivedOthers.Count - 1; var recentRounds = targetRounds.OrderByDescending(it => it.Number).Take(recentRoundCount); return(alivedOthers.Except(recentRounds.Select(it => it.MatchedOther))); }