void CreateWuTongDict()
        {
            wutongKeyDict.Clear();

            CardInfo[] cards = new CardInfo[5]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(), new CardInfo(),
                new CardInfo()
            };

            float score = CardsTypeEvaluation.GetWuTongBaseScore(14);

            AddWuTongKeyToList(null, score);

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;
                cards[1].value = i;
                cards[2].value = i;
                cards[3].value = i;
                cards[4].value = i;

                if (i == 1)
                {
                    score = CardsTypeEvaluation.GetWuTongBaseScore(14);
                }
                else
                {
                    score = CardsTypeEvaluation.GetWuTongBaseScore(i);
                }

                for (int s0 = 0; s0 < 4; s0++)
                {
                    cards[0].suit = s0;

                    for (int s1 = 0; s1 < 4; s1++)
                    {
                        cards[1].suit = s1;

                        for (int s2 = 0; s2 < 4; s2++)
                        {
                            cards[2].suit = s2;

                            for (int s3 = 0; s3 < 4; s3++)
                            {
                                cards[3].suit = s3;

                                for (int s4 = 0; s4 < 4; s4++)
                                {
                                    cards[4].suit = s4;

                                    AddWuTongKeyToList(cards, score);
                                }
                            }
                        }
                    }
                }
            }
        }
        void CreateTongHuaDict()
        {
            tonghuaKeyDict.Clear();

            CardInfo[] cards = new CardInfo[5]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(), new CardInfo(),
                new CardInfo()
            };

            float score;

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;

                for (int j = 1; j <= 13; j++)
                {
                    cards[1].value = j;
                    for (int k = 1; k <= 13; k++)
                    {
                        cards[2].value = k;
                        for (int m = 1; m <= 13; m++)
                        {
                            cards[3].value = m;

                            for (int n = 1; n <= 13; n++)
                            {
                                if (i == j + 1 && j == k + 1 &&
                                    k == m + 1 && m == n + 1)
                                {
                                    continue;
                                }

                                score = CardsTypeEvaluation.GetTongHuaBaseScore(new float[] { i, j, k, m, n });

                                cards[4].value = n;

                                for (int y = 0; y < 4; y++)
                                {
                                    for (int x = 0; x < 5; x++)
                                    {
                                        cards[x].suit = y;
                                    }

                                    AddTongHuaKeyToList(cards, score);
                                }
                            }
                        }
                    }
                }
            }
        }
        void CreateTieZhiDict()
        {
            tiezhiKeyDict.Clear();

            CardInfo[] cards = new CardInfo[4]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(), new CardInfo(),
            };

            float score = CardsTypeEvaluation.GetTieZhiBaseScore(14);

            AddTieZhiKeyToList(null, score);

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;
                cards[1].value = i;
                cards[2].value = i;
                cards[3].value = i;

                if (i == 1)
                {
                    score = CardsTypeEvaluation.GetTieZhiBaseScore(14);
                }
                else
                {
                    score = CardsTypeEvaluation.GetTieZhiBaseScore(i);
                }

                for (int s0 = 0; s0 < 4; s0++)
                {
                    cards[0].suit = s0;

                    for (int s1 = 0; s1 < 4; s1++)
                    {
                        cards[1].suit = s1;

                        for (int s2 = 0; s2 < 4; s2++)
                        {
                            cards[2].suit = s2;

                            for (int s3 = 0; s3 < 4; s3++)
                            {
                                cards[3].suit = s3;
                                AddTieZhiKeyToList(cards, score);
                            }
                        }
                    }
                }
            }
        }
        void CreateSanTiaoDict()
        {
            santiaoKeyDict.Clear();

            CardInfo[] cards = new CardInfo[3]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(),
            };

            float score = CardsTypeEvaluation.GetSanTiaoBaseScore(14);

            AddSanTiaoKeyToList(null, score);

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;
                cards[1].value = i;
                cards[2].value = i;

                if (i == 1)
                {
                    score = CardsTypeEvaluation.GetSanTiaoBaseScore(14);
                }
                else
                {
                    score = CardsTypeEvaluation.GetSanTiaoBaseScore(i);
                }

                for (int s0 = 0; s0 < 4; s0++)
                {
                    cards[0].suit = s0;

                    for (int s1 = 0; s1 < 4; s1++)
                    {
                        cards[1].suit = s1;

                        for (int s2 = 0; s2 < 4; s2++)
                        {
                            cards[2].suit = s2;
                            AddSanTiaoKeyToList(cards, score);
                        }
                    }
                }
            }
        }
        void CreateDuiZiDict()
        {
            duiziKeyDict.Clear();

            CardInfo[] cards = new CardInfo[2]
            {
                new CardInfo(), new CardInfo(),
            };

            float score = CardsTypeEvaluation.GetDuiziBaseScore(14);

            AddDuiZiKeyToList(null, score);

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;
                cards[1].value = i;

                if (i == 1)
                {
                    score = CardsTypeEvaluation.GetDuiziBaseScore(14);
                }
                else
                {
                    score = CardsTypeEvaluation.GetDuiziBaseScore(i);
                }

                for (int s0 = 0; s0 < 4; s0++)
                {
                    cards[0].suit = s0;

                    for (int s1 = 0; s1 < 4; s1++)
                    {
                        cards[1].suit = s1;
                        AddDuiZiKeyToList(cards, score);
                    }
                }
            }
        }
        void CreateTwoDuiDict()
        {
            twoduiKeyDict.Clear();

            CardInfo[] cards = new CardInfo[4]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(), new CardInfo(),
            };

            float score;
            float a, b;

            for (int i = 1; i <= 13; i++)
            {
                cards[0].value = i;
                cards[1].value = i;


                for (int s0 = 0; s0 < 4; s0++)
                {
                    cards[0].suit = s0;

                    for (int s1 = 0; s1 < 4; s1++)
                    {
                        cards[1].suit = s1;

                        for (int j = 1; j <= 13; j++)
                        {
                            cards[2].value = j;
                            cards[3].value = j;

                            if (i == 1)
                            {
                                a = 14;
                            }
                            else
                            {
                                a = i;
                            }

                            if (j == 1)
                            {
                                b = 14;
                            }
                            else
                            {
                                b = j;
                            }

                            score = CardsTypeEvaluation.GetTwoDuiBaseScore(a, b);

                            for (int m0 = 0; m0 < 4; m0++)
                            {
                                cards[2].suit = m0;

                                for (int m1 = 0; m1 < 4; m1++)
                                {
                                    cards[3].suit = m1;

                                    AddTwoDuiKeyToList(cards, score);
                                }
                            }
                        }
                    }
                }
            }
        }
        void AddHuluKeyToList(CardInfo[] cards, float score)
        {
            if (isCheckSuitCount)
            {
                int[]        value      = new int[14];
                List <int>[] suitCounts = new List <int>[4]
                {
                    new List <int>(value), new List <int>(value), new List <int>(value), new List <int>(value)
                };

                for (int i = 0; i < cards.Length; i++)
                {
                    suitCounts[cards[i].suit][cards[i].value]++;
                    if (suitCounts[cards[i].suit][cards[i].value] > limitSameSuitCount)
                    {
                        return;
                    }
                }
            }


            if (cards[0].value == cards[1].value &&
                cards[0].value == cards[2].value &&
                cards[0].value == cards[3].value &&
                cards[0].value == cards[4].value)
            {
                return;
            }

            CardKey cardkey = new CardKey();

            for (int i = 0; i < cards.Length; i++)
            {
                cardkey = AppendCardToCardKey(cardkey, cards[i].value, cards[i].suit);
            }

            AddToDict(huluKeyDict, cardkey, 0, score);

            //
            int   tmp1;
            float score2 = score;
            float tmpScore;

            if (cards[0].value < cards[3].value)
            {
                score2 = CardsTypeEvaluation.GetHuLuBaseScore(cards[3].value, cards[0].value);
            }

            for (int i = 0; i < 4; i++)
            {
                tmp1           = cards[i].value;
                cards[i].value = -1;

                cardkey = new CardKey();
                for (int j = 0; j < cards.Length; j++)
                {
                    if (cards[j].value == -1)
                    {
                        continue;
                    }

                    cardkey = AppendCardToCardKey(cardkey, cards[j].value, cards[j].suit);
                }

                if (i > 2)
                {
                    tmpScore = score2;
                }
                else
                {
                    tmpScore = score;
                }

                AddToDict(huluKeyDict, cardkey, 1, tmpScore);
                cards[i].value = tmp1;
            }
        }
        void CreateShunziDict()
        {
            shunziKeyDict.Clear();

            CardInfo[] cards = new CardInfo[5]
            {
                new CardInfo(), new CardInfo(),
                new CardInfo(), new CardInfo(),
                new CardInfo()
            };

            float score = CardsTypeEvaluation.GetShunZiBaseScore(10);

            AddShunziKeyToList(null, 0, score);

            for (int i = 1; i <= 10; i++)
            {
                score = CardsTypeEvaluation.GetShunZiBaseScore(i);

                for (int s0 = -1; s0 < 4; s0++)
                {
                    if (s0 != -1)
                    {
                        cards[0].value = i;
                        cards[0].suit  = s0;
                        AddShunziKeyToList(cards, 1, score);
                    }
                    else
                    {
                        cards[0].value = -1;
                    }

                    for (int s1 = -1; s1 < 4; s1++)
                    {
                        if (s1 != -1)
                        {
                            cards[1].value = i + 1;
                            cards[1].suit  = s1;
                            AddShunziKeyToList(cards, 2, score);
                        }
                        else
                        {
                            cards[1].value = -1;
                        }

                        for (int s2 = -1; s2 < 4; s2++)
                        {
                            if (s2 != -1)
                            {
                                cards[2].value = i + 2;
                                cards[2].suit  = s2;
                                AddShunziKeyToList(cards, 3, score);
                            }
                            else
                            {
                                cards[2].value = -1;
                            }

                            for (int s3 = -1; s3 < 4; s3++)
                            {
                                if (s3 != -1)
                                {
                                    cards[3].value = i + 3;
                                    cards[3].suit  = s3;
                                    AddShunziKeyToList(cards, 4, score);
                                }
                                else
                                {
                                    cards[3].value = -1;
                                }


                                for (int s4 = 0; s4 < 4; s4++)
                                {
                                    cards[4].suit = s4;
                                    if (i + 4 == 14)
                                    {
                                        cards[4].value = 1;
                                    }
                                    else
                                    {
                                        cards[4].value = i + 4;
                                    }

                                    AddShunziKeyToList(cards, 5, score);
                                }
                            }
                        }
                    }
                }
            }
        }
 public Comparer(CardsTypeEvaluation cardsTypeEval)
 {
     this.cardsTypeEval = cardsTypeEval;
 }