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

Posted

技术标签:

【中文标题】使用 LINQ 拆分列表中的重复项【英文标题】:Split duplicates in lists using LINQ 【发布时间】:2020-10-16 19:09:11 【问题描述】:

到目前为止我有这个代码

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 副牌,所以每个花色有 2 张牌。

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

此时 _cardsCombination 查询获取所有选择的卡片,并使用所有具有相同值的卡片组成一个较小的组。我怎样才能做同样的事情并为每张带有重复套装的卡片创建子组?

谢谢。

【问题讨论】:

你喜欢用.Distinct 吗? 我不太了解这款游戏,但由于您正在使用基于卡片的排列或组合 - 通常在分析后更容易从手牌中移除组合.这样你就可以在剩下的手上重新应用逻辑。 我已经尝试了这两种解决方案,但我不知道该怎么做。我刚刚得到了一个列表 3 心 - 3 心、3 方块 - 3 方块、3 黑桃 - 3 黑桃、3 梅花 - 3 梅花 而不是 3 心 - 3 钻石 - 3 黑桃- 3 个梅花,3 个红心 - 3 个方块 - 3 个黑桃 - 3 个梅花 【参考方案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();

【讨论】:

由于某种原因,我没有收到答复通知。非常感谢您的回答,我会尽快尝试! :)(同时,我用嵌套的 for 编写了 60 多行代码,以使其工作) 谢谢您,先生,您的时间(以及代码中的 cmets),这对我来说就像魔术一样! (我肯定需要学习更多的 LINQ)

以上是关于使用 LINQ 拆分列表中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 从列表中获取重复项? [复制]

如何使用LINQ从列表中获取重复项?

C# LINQ 在列表中查找重复项

仅包含每个重复项中的第一个的 Linq 键

C#确定列表中的重复项[重复]

使用LINQ去除重复项。