Разделение дубликатов в списках с помощью 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();