//Get Explicit Amounts
        public static IList <T> GetFullHouse <T>(this ITexasHoldemPokerHand <T> self) where T : IGambleCard
        {
            ITexasHoldemPokerHand <T>
            tempHand = new TexasHoldemPokerHand <T>(self);
            IList <T>
            fullHouse    = new List <T>(),
                tempKind = tempHand.GetThreeOfAKind();

            if (tempKind.Count > 0)
            {
                for (int i = 0; i < tempKind.Count; i++)
                {
                    tempHand.Remove(tempKind[i]);
                    fullHouse.Add(tempKind[i]);
                }
                tempKind = tempHand.GetPair();
                if (tempKind.Count > 0)
                {
                    for (int i = 0; i < tempKind.Count; i++)
                    {
                        //We dont carea bout removing, so just add
                        fullHouse.Add(tempKind[i]);
                    }
                }
                else
                {
                    fullHouse.Clear();
                }
            }
            return(fullHouse);
        }
        public static ITexasHoldemPokerHand <T> GetBestPokerHand <T>(this ITexasHoldemPokerHand <T> self) where T : IGambleCard
        {
            ITexasHoldemPokerHand <T>
            tempHand        = new TexasHoldemPokerHand <T>(self),
                currentBest = new TexasHoldemPokerHand <T>();
            IList <T>
            tempBest;
            TexasHoldemPokerRank
                 currentRank = TexasHoldemPokerRank.HighCard;
            bool hit         = false;

            int remaining = (5 - currentBest.Count);

            tempBest = tempHand.GetRoyalFlush();
            if (tempBest.Count > 0 && !hit)
            {
                if (currentRank < TexasHoldemPokerRank.RoyalFlush)
                {
                    currentRank = TexasHoldemPokerRank.RoyalFlush;
                }
                for (int i = 0; i < tempBest.Count; i++)
                {
                    currentBest.Add(tempBest[i]);
                    tempHand.Remove(tempBest[i]);
                }
                remaining = (5 - currentBest.Count);
                hit       = true;
            }
            if (!hit)
            {
                tempBest = tempHand.GetStraightFlush();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.StraightFlush)
                    {
                        currentRank = TexasHoldemPokerRank.StraightFlush;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetFourOfAKind();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.FourOfAKind)
                    {
                        currentRank = TexasHoldemPokerRank.FourOfAKind;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetFullHouse();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.FullHouse)
                    {
                        currentRank = TexasHoldemPokerRank.FullHouse;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetFlush();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.Flush)
                    {
                        currentRank = TexasHoldemPokerRank.Flush;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetStraight();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.Straight)
                    {
                        currentRank = TexasHoldemPokerRank.Straight;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetThreeOfAKind();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.ThreeOfAKind)
                    {
                        currentRank = TexasHoldemPokerRank.ThreeOfAKind;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetTwoPair();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.TwoPair)
                    {
                        currentRank = TexasHoldemPokerRank.TwoPair;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }
            if (!hit)
            {
                tempBest = tempHand.GetPair();
                if (tempBest.Count > 0)
                {
                    if (currentRank < TexasHoldemPokerRank.OnePair)
                    {
                        currentRank = TexasHoldemPokerRank.OnePair;
                    }
                    for (int i = 0; i < tempBest.Count; i++)
                    {
                        currentBest.Add(tempBest[i]);
                        tempHand.Remove(tempBest[i]);
                    }
                    remaining = (5 - currentBest.Count);
                    hit       = true;
                }
            }

            while (remaining >= 1)
            {
                T card = tempHand.GetHighCard();

                if (card != null)
                {
                    currentBest.Add(card);
                    tempHand.Remove(card);

                    remaining = (5 - currentBest.Count);
                }
                else
                {
                    break;
                }
            }
            //Console.WriteLine(currentRank.ToString());
            currentBest.Rank = currentRank;

            return(currentBest);
        }