Разделение дубликатов в списках с помощью LINQ

Пока у меня есть этот код

public class Card
{
    public int suitID;
    public int cardValue;
}

public class DeckManager
{
    private List<List<Card>> FindCardsPerSuit(List<Card> cards)
    {
        var _cardsCombination = cards
                                .GroupBy(x => x.cardValue)
                                .Where(g => g.Count() > 2)
                                .Select(c => c.ToList())
                                .ToList();

        return _cardsCombination;
    }
}

Я работаю над карточной игрой Рамми и пытаюсь выяснить, действительна ли комбинация карт, которую хочет сыграть игрок.

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

Пример: у игрока есть 8 карт одинакового достоинства, но разных мастей, минимальная комбинация равна 4, так что вы можете составить 2 комбинации, а поскольку вы играете двумя колодами, у вас есть 2 карты на масть.

Как я могу узнать, хочу ли я создать список списков комбинаций?

В настоящий момент запрос _cardsCombination выбирает все карты и составляет меньшую группу со всеми картами с одинаковым значением. Как я могу сделать то же самое и создать подгруппы для каждой карты с дубликатом масти?

Спасибо.

1 ответ

Решение
var _cardsCombination = cards
    .GroupBy(x => x.cardValue)
    .SelectMany(g => {
        // group cards by suit
        var cardsPerSuit = g.GroupBy(c => c.suitId);
            
        // max number of cards with same suit (will be 1 or 2 for two decks)
        // this will be number of subsets
        var maxCardsPerSuit = cardsPerSuit.Max(gg => gg.Count());
        
        return Enumerable
            // create subset for each setNumber from 0 to maxCardsPerSuit - 1
            .Range(0, maxCardsPerSuit)
            .Select(setNumber => cardsPerSuit
                // take nth card from each suit
                .Select(s => s.ElementAtOrDefault(setNumber))
                // skip nulls
                .Where(s => s != null)
            );
    })
    .Where(g => g.Count() > 2)
    .Select(c => c.ToList())
    .ToList();
Другие вопросы по тегам