using System.Collections.Generic;
public static void Main()
var deck = new Deck(true);
Console.WriteLine(deck.ToString());
public Suit Suit {get; set;}
public string Value {get; set;}
public override string ToString()
return $"{Suit}::{Value}";
public Deck(bool includesJokers = false){
_deck = new List<Card>();
_includesJokers = includesJokers;
foreach(var suit in Enum.GetValues(typeof(Suit)))
if((Suit)suit == Suit.None)
for(var i = 2; i <= 10; i++)
_deck.Add(new Card{ Suit = (Suit)suit, Value = i.ToString()});
_deck.Add(new Card{ Suit = (Suit)suit, Value = "J"});
_deck.Add(new Card{ Suit = (Suit)suit, Value = "Q"});
_deck.Add(new Card{ Suit = (Suit)suit, Value = "K"});
_deck.Add(new Card{ Suit = (Suit)suit, Value = "A"});
_deck.Add(new Card{ Suit = Suit.None, Value = "JOKER"});
_deck.Add(new Card{ Suit = Suit.None, Value = "JOKER"});
public override string ToString()
var sb = new StringBuilder();
foreach(var card in _deck)
sb.AppendLine(card.ToString());
var newDeck = new List<Card>();
var clonedDeck = new List<Card>(_deck);
for(var i = 0; i < _deck.Count; i++)
var index = rand.Next(0, clonedDeck.Count);
var card = clonedDeck[index];
var newDeck = new List<Card>();
newDeck.AddRange(_deck.Where(x => x.Suit == Suit.Club).OrderBy(y => y.Value));
newDeck.AddRange(_deck.Where(x => x.Suit == Suit.Diamond).OrderBy(y => y.Value));
newDeck.AddRange(_deck.Where(x => x.Suit == Suit.Heart).OrderBy(y => y.Value));
newDeck.AddRange(_deck.Where(x => x.Suit == Suit.Spade).OrderBy(y => y.Value));
newDeck.Add(new Card{ Suit = Suit.None, Value = "JOKER" });
newDeck.Add(new Card{ Suit = Suit.None, Value = "JOKER" });