public override Hand newHand(Hand Hand)
        {
            var StraightCards = new List<Card>();
            Card PreviousCard = null;

            var Cards = Hand.getCards();
            Cards.Sort((Card1, Card2) => { return Card1.compareTo(Card2); });

            foreach (var Card in Cards) {
                if (PreviousCard is Card) {
                    if (Card.compareFaceValue(PreviousCard) == 0) {
                        continue;
                    } else if (PreviousCard.isAce() && Card.getFaceValue() == 5) { // Wheels are Straights too, you know
                        StraightCards.Add(Card);
                    } else if (PreviousCard.getFaceValue() - 1 == Card.getFaceValue()) {
                        StraightCards.Add(Card);
                    } else {
                        StraightCards = new List<Card> { Card };
                    }
                } else {
                    StraightCards.Add(Card);
                }

                PreviousCard = Card;
                if (StraightCards.Count == 5) {
                    return new Straight(StraightCards);
                }
            }

            return null;
        }
        public override Hand newHand(Hand Hand)
        {
            var SpadesCards = new List<Card>();
            var HeartsCards = new List<Card>();
            var ClubsCards = new List<Card>();
            var DiamondsCards = new List<Card>();

            var Cards = Hand.getCards();
            Cards.Sort((Card1, Card2) => { return Card1.compareTo(Card2); });

            foreach (var Card in Cards) {
                switch (Card.getSuit()) {
                    case Suit.SPADES:
                        if (canAddCardTo(SpadesCards, Card)) {
                            SpadesCards.Add(Card);
                            if (SpadesCards.Count == 5) {
                                return new StraightFlush(SpadesCards);
                            }
                        }
                        break;

                    case Suit.HEARTS:
                        if (canAddCardTo(HeartsCards, Card)) {
                            HeartsCards.Add(Card);
                            if (HeartsCards.Count == 5) {
                                return new StraightFlush(HeartsCards);
                            }
                        }
                        break;

                    case Suit.CLUBS:
                        if (canAddCardTo(ClubsCards, Card)) {
                            ClubsCards.Add(Card);
                            if (ClubsCards.Count == 5) {
                                return new StraightFlush(ClubsCards);
                            }
                        }
                        break;

                    case Suit.DIAMONDS:
                        if (canAddCardTo(DiamondsCards, Card)) {
                            DiamondsCards.Add(Card);
                            if (DiamondsCards.Count == 5) {
                                return new StraightFlush(DiamondsCards);
                            }
                        }
                        break;
                }
            }

            return null;
        }
        public override Hand newHand(Hand Hand)
        {
            var SpadesCards = new List<Card>();
            var HeartsCards = new List<Card>();
            var ClubsCards = new List<Card>();
            var DiamondsCards = new List<Card>();

            foreach (var Card in Hand.getCards()) {
                switch (Card.getSuit()) {
                    case Suit.SPADES:
                        SpadesCards.Add(Card);
                        if (SpadesCards.Count == 5) {
                            return new Flush(SpadesCards);
                        }
                        break;

                    case Suit.HEARTS:
                        HeartsCards.Add(Card);
                        if (HeartsCards.Count == 5) {
                            return new Flush(HeartsCards);
                        }
                        break;

                    case Suit.CLUBS:
                        ClubsCards.Add(Card);
                        if (ClubsCards.Count == 5) {
                            return new Flush(ClubsCards);
                        }
                        break;

                    case Suit.DIAMONDS:
                        DiamondsCards.Add(Card);
                        if (DiamondsCards.Count == 5) {
                            return new Flush(DiamondsCards);
                        }
                        break;
                }
            }

            return null;
        }
 public override Hand newHand(Hand Hand)
 {
     return new TwoPair(Hand.getCards());
 }