使用 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 拆分列表中的重复项的主要内容,如果未能解决你的问题,请参考以下文章