public override Hand newHand(Hand hand)
        {
            var groupedByValue = hand.getCardsGroupedByValues();
            var highestValue = groupedByValue.First().Value;
            groupedByValue.Remove(groupedByValue.First().Key);
            var handCards = new List<Card>();

            if (highestValue.Count == numberOfCards) {
                handCards.AddRange(highestValue);
                handCards.AddRange(groupedByValue.First().Value.Take(1));
            } else {
                handCards.AddRange(highestValue.Take(1));

                while (groupedByValue.Count > 0 && handCards.Count < 5) {
                    var cardsOfValue = groupedByValue.First().Value;
                    groupedByValue.Remove(groupedByValue.First().Key);

                    if (cardsOfValue.Count == numberOfCards) {
                        handCards.AddRange(cardsOfValue);
                    }
                }
            }

            if (handCards.Count == 5) {
                return (Hand) Activator.CreateInstance(handClass, new object[] { handCards });
            } else {
                return null;
            }
        }
        public override bool isSatisfiedBy(Hand Hand)
        {
            int numPairsSeen = 0;
            var CardsGroupedByValues = Hand.getCardsGroupedByValues();
            foreach (var Cards in CardsGroupedByValues) {
                if (Cards.Value.Count == 2) {
                    numPairsSeen++;
                }
            }

            var canMakeTwoPair = (2 == numPairsSeen);
            return canMakeTwoPair;
        }
        public override bool isSatisfiedBy(Hand Hand)
        {
            var GroupedByValue = Hand.getCardsGroupedByValues();
            var faceValueCounts = new Dictionary<int, int>();

            foreach (KeyValuePair<int, List<Card>> cardsAndValue in GroupedByValue) {
                faceValueCounts.Add(cardsAndValue.Key, cardsAndValue.Value.Count);
            }

            int highestCount = 0;
            foreach (KeyValuePair<int, int> faceValueAndCount in faceValueCounts) {
                if (faceValueAndCount.Value > highestCount) {
                    highestCount = faceValueAndCount.Value;
                }
            }

            return highestCount == numberOfCards;
        }
        public override Hand newHand(Hand hand)
        {
            var groupedByValue = hand.getCardsGroupedByValues();
            var handCards = groupedByValue.First().Value;
            groupedByValue.Remove(groupedByValue.First().Key);

            if (handCards.Count == numberOfCards) {
                handCards.Add(groupedByValue.First().Value.First());
                groupedByValue.Remove(groupedByValue.First().Key);
            } else {
                handCards.AddRange(
                    groupedByValue.Where(
                        cardsOfValue => {
                    return cardsOfValue.Value.Count == numberOfCards;
                }
                    ).First().Value
                );
            }

            int cardsLeftToAdd = 5 - handCards.Count;

            while (cardsLeftToAdd > 0 && groupedByValue.Count > 0) {
                var cardsOfValue = groupedByValue.First().Value;
                groupedByValue.Remove(groupedByValue.First().Key);

                while (cardsLeftToAdd > 0 && cardsOfValue.Count > 0) {
                    var nextCard = cardsOfValue.First();
                    cardsOfValue.Remove(nextCard);
                    handCards.Add(nextCard);
                    cardsLeftToAdd--;
                }
            }

            if (handCards.Count == 5) {
                return (Hand) Activator.CreateInstance(handClass, new object[] { handCards });
            } else {
                return null;
            }
        }