【问题标题】:Split duplicates in lists using LINQ使用 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 个梅花}

标签: c# linq unity3d card


【解决方案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)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多