void Main() { var deck = Enumerable.Range(0,52); GetAllHands(deck,5).Count().Dump("All 5 card hands"); } IEnumerable> GetAllHands(IEnumerable deck, int handSize) { var count = 0; foreach(var card in deck) { if(handSize == 1) yield return new[]{card}; else foreach(var hand in GetAllHands(deck.Skip(++count), handSize-1)) yield return new[]{card}.Concat(hand); } }