输入数组,取组合结果

/// <summary>
       /// 
       /// </summary>
       /// <param name="arrAllComOut">最后返回的所有组合列表</param>
       /// <param name="arrAllInput">需要进行组合提取的源数组</param>
       /// <param name="comCount">需要今天提取的数量</param>
        public static void GetTheComList(List<int[]> arrAllComOut, List<int> arrAllInput,int comCount)
        {
            try
            {
                //先清空数据
                arrAllComOut.Clear();
                int[] SourceArrIndex = new int[arrAllInput.Count];
                //int[] SourceArrIndex = new int[15] { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                int[] SourceArrNumber = new int[arrAllInput.Count];
                //int[] SourceArrNumber = new int[15] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
                //生成5个数的组合 
                ProcessSourceData(ref SourceArrIndex, ref SourceArrNumber, arrAllInput, comCount);
                GetComListByIcount(SourceArrIndex, SourceArrNumber, arrAllComOut, arrAllInput, comCount);
                //绑定数据到gridview

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private static void GetComListByIcount(int[] SourceArrIndex, int[] SourceArrNumber, List<int[]> arrAllComIn, List<int> arrAllInput, int ICount)
        {
            while (CheckSourceArrIndex(SourceArrIndex, ICount) == false)
            {
                int j = 0;
                int[] Resault = new int[ICount];
                //一轮处理
                for (int i = 0; i < SourceArrIndex.Length; i++)
                {
                    if (SourceArrIndex[i] == 1)
                    {
                        Resault[j] = SourceArrNumber[i];
                        j++;
                    }
                }
                arrAllComIn.Add(Resault);
                //一轮处理结束
                //处理SourceArrIndex
                ProcessSourceArrIndex(ref SourceArrIndex);
            }
            //添加最后一条数据,也就是当最后5个为1时的数组
            int[] LastResault = new int[ICount];
            int x = 0;
            for (int c = arrAllInput.Count - 1; c >= arrAllInput.Count - ICount; c--)
            {
                LastResault[x] = Convert.ToInt16(arrAllInput[c]);
                x++;
            }
            //int[] LastResault = new int[5] { 11, 12, 13, 14, 15 };
            arrAllComIn.Add(LastResault);

        }
        private static void ProcessSourceArrIndex(ref int[] SourceArrIndex)
        {
            try
            {
                int x = 0;
                for (int i = 0; i < SourceArrIndex.Length; i++)
                {
                    if (i != SourceArrIndex.Length - 1 && SourceArrIndex[i] == 1)
                    {
                        //只处理第一个10
                        if (SourceArrIndex[i + 1] == 0)
                        {
                            //交换
                            SourceArrIndex[i] = 0;
                            SourceArrIndex[i + 1] = 1;
                            //左移
                            for (int j = 0; j <= i; j++)
                            {
                                if (SourceArrIndex[j] == 1)
                                {
                                    //如果为1, 则设置为0,并且将前面的第X个元素设置为1
                                    SourceArrIndex[j] = 0;
                                    SourceArrIndex[x] = 1;
                                    x++;
                                }
                            }
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private static bool CheckSourceArrIndex(int[] SourceArrIndex, int ICount)
        {
            for (int i = 1; i <= ICount; i++)
            {
                if (SourceArrIndex[SourceArrIndex.Length - i] != 1)
                {
                    return false;
                }
            }
         
            return true;
        }
        private static void ProcessSourceData(ref int[] SourceArrIndex, ref int[] SourceArrNumber, List<int> arrInputAll, int ICount)
        {
            int i = 0;
            foreach (int InputInt in arrInputAll)
            {
                for (int j = 0; j < ICount; j++)
                {
                    SourceArrIndex[j] = 1;
                }
                for (int x = ICount; x < SourceArrIndex.Length; x++)
                {
                    SourceArrIndex[x] = 0;
                }
                SourceArrNumber[i] = InputInt;
                i++;
            }
        }

调用方式:

 List<int[]> arrAllCom = new List<int[]>();//需要计算的组合列表
            //得到组合结果集
  Cls_Utility.GetTheComList(arrAllCom, arrInput, comCount);

 

posted @ 2016-07-16 16:12  龍☆  阅读(252)  评论(0编辑  收藏  举报