FECipherVit.Region.Shuffle C# (CSharp) Method

Shuffle() public method

public Shuffle ( ) : void
return void
        public void Shuffle()
        {
            if (CardList.Count > 0)
            {
                if (Convert.ToBoolean(AppConfig.GetValue("UseNewShuffle")))
                {
                    string notes = Environment.NewLine + Environment.NewLine + "洗牌";
                    int N = CardList.Count;
                    notes += N.ToString() + "张:" + Environment.NewLine;
                    List<int> IntList = new List<int>(N);
                    for (int i = 0; i < N; i++)
                    {
                        IntList.Add(i);
                    }
                    Random rnd = new Random();
                    List<Card> CardListTemp1 = new List<Card>(N);
                    List<Card> CardListTemp2 = new List<Card>(N);
                    Dictionary<string, int> UnitNameDict = new Dictionary<string, int>();
                    foreach (Card card in CardList)
                    {
                        notes += card.CardName + Environment.NewLine;
                        if (UnitNameDict.Keys.Contains<string>(card.UnitName))
                        {
                            UnitNameDict[card.UnitName]++;
                        }
                        else
                        {
                            UnitNameDict.Add(card.UnitName, 1);
                        }
                    }
                    for (int i = 0; i < N; i++)
                    {
                        CardListTemp1.Add(null);
                    }
                    foreach (KeyValuePair<string, int> pair in UnitNameDict.OrderByDescending(pair => pair.Value))
                    {
                        List<int> IntListTemp = new List<int>();
                        IntListTemp.AddRange(IntList);
                        notes += "插入" + pair.Value.ToString() + "张" + pair.Key + Environment.NewLine;
                        int divides = IntList.Count / pair.Value;
                        int remain = IntList.Count % pair.Value;
                        for (int i = 0; i < pair.Value; i++)
                        {
                            int number;
                            int StartPos = 0;
                            int EndPos = 0;
                            if (remain != 0)
                            {
                                if (i == 0)
                                {
                                    StartPos = 0;
                                    EndPos = divides;
                                }
                                else if (i < remain)
                                {
                                    StartPos = i * (divides + 1);
                                    EndPos = StartPos + divides;
                                }
                                else if (i == remain)
                                {
                                    StartPos = remain * (divides + 1);
                                    EndPos = StartPos + divides - 1;
                                }
                                else
                                {
                                    StartPos = i * divides + remain;
                                    EndPos = StartPos + divides - 1;
                                }
                            }
                            else
                            {
                                StartPos = i * divides;
                                EndPos = (i + 1) * divides - 1;
                            }

                            number = rnd.Next(StartPos, EndPos + 1);
                            notes += "(" + StartPos.ToString() + "~" + EndPos.ToString() + ") => " + number.ToString() + " => ";
                            int cardtomovenumber = 0;
                            foreach (Card card in CardList)
                            {
                                if (card.UnitName == pair.Key)
                                {
                                    cardtomovenumber = CardList.IndexOf(card);
                                    break;
                                }
                            }
                            int cardnumbernew = IntList[number];
                            notes += cardnumbernew.ToString() + Environment.NewLine;
                            CardListTemp1.RemoveAt(cardnumbernew);
                            CardListTemp1.Insert(cardnumbernew, CardList[cardtomovenumber]);
                            IntListTemp.Remove(cardnumbernew);
                            CardList.RemoveAt(cardtomovenumber);
                        }
                        IntList = IntListTemp;
                    }
                    notes += Environment.NewLine + "平均分配后:" + Environment.NewLine;
                    foreach (Card card in CardListTemp1)
                    {
                        notes += card.CardName + Environment.NewLine;
                    }
                    int ShuffleTime = rnd.Next(5, 11);
                    notes += Environment.NewLine + "切洗" + ShuffleTime.ToString() + "次:" + Environment.NewLine;
                    for (int i = 0; i < ShuffleTime; i++)
                    {
                        CardListTemp2 = new List<Card>();
                        notes += "第" + (i + 1).ToString() + "次," + Environment.NewLine;
                        int StartPos = rnd.Next(CardListTemp1.Count);
                        int EndPos = rnd.Next(StartPos, CardListTemp1.Count);
                        for (int j = StartPos; j <= EndPos; j++)
                        {
                            CardListTemp2.Add(CardListTemp1[j]);
                        }
                        for (int j = 0; j < StartPos; j++)
                        {
                            CardListTemp2.Add(CardListTemp1[j]);
                        }
                        for (int j = EndPos + 1; j < CardListTemp1.Count; j++)
                        {
                            CardListTemp2.Add(CardListTemp1[j]);
                        }
                        notes += "将第" + (StartPos + 1).ToString() + "~" + (EndPos + 1).ToString() + "张卡抽出,置于最顶端后:" + Environment.NewLine;
                        foreach (Card card in CardListTemp2)
                        {
                            notes += card.CardName + Environment.NewLine;
                        }
                        CardListTemp1 = CardListTemp2;
                    }
                    CardList = CardListTemp1;
                    //using (StreamWriter writer = File.AppendText("ShuffleNotes.txt"))
                    //{
                    //    writer.Write(notes);
                    //}
                }
                else
                {
                    int N = CardList.Count;
                    int[] array = new int[N];
                    for (int i = 0; i < N; i++)
                    {
                        array[i] = i;
                    }
                    Random rnd = new Random();
                    for (int j = 0; j < N; j++)
                    {
                        int pos = rnd.Next(j, N);
                        int temp = array[pos];
                        array[pos] = array[j];
                        array[j] = temp;
                    }
                    List<Card> CardList_temp = new List<Card>();
                    for (int i = 0; i < N; i++)
                    {
                        CardList_temp.Add(CardList[array[i]]);
                    }
                    CardList = CardList_temp;
                }
            }
        }