使用 LINQ 拆分列表中的重复项

Split duplicates in lists using 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;
    }
}

我正在开发 Rummy 纸牌游戏,我想做的是确定玩家想要玩的纸牌组合是否有效。

当玩家从手牌中选择一些牌时,我需要检查具有相同价值的牌是否具有独特的花色,否则将其添加到新列表中。

示例: 玩家有 8 张价值相同但花色不同的牌,最小组合是 4,所以你可以做 2 种组合,因为你玩 2 副牌,所以每套牌有 2 张牌。

如何确定是否要创建组合列表列表?

目前 _cardsCombination 查询会选择所有卡片,并使用所有具有相同值的卡片组成一个较小的组。我怎样才能做同样的事情并为每张花色重复的卡片创建子组?

谢谢。

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();