飞/可爱朋 发表于 2014-8-18 10:26:07

通用泛型,迪卡尔积算法分享

本帖最后由 飞/可爱朋 于 2014-8-18 10:43 编辑

/// <summary>
      /// 笛卡尔积算法,从一组数据List<T>中随机抽取里面的数据元素进行组合
      /// 如:{A,B,C} {1,2,3} {大,小} 三组数据中各个数组中抽取一个元素进行组合
      /// 结果有 A 1 大,A 2 大,A 3 大,A 1 小,A 2 小等数据组合
      /// 下面的代码将会实现对数据的随机抽取,使用的算法是迪卡尔积算法
      /// </summary>
      /// <param name="AllTable">需要传递进去的泛型,当前为DataTable,可以更换其他类型</param>
      /// <returns>返回随机抽取后得到的数据</returns>
      public List<List<DataTable>> DcAllOrderTableCompute(List<List<DataTable>> AllTable)
      {
            //定义变量,接受随机抽取产生的List<DtaTable>
            var ResultList = new List<List<DataTable>>();


            int Count = 1;

            //计算得出需要计算的Count次数,Item表示List<List<DataTbale>>泛型中包含的子<List<DataTable>>
            //循环的次数从 子个数 到 子个数所包含的<DataTable>个数互相相乘的个数
            //如总泛型{ {A,B,C},{1,2,3},{大,小}} 包含了三个子元素
            // {A,B,C} 包含3个元素
            // {1,2,3}包含3个元素
            // {大,小} 包含2个元素
            //本次迪卡尔积的循环次数范围为3 -- 3*3*2 及为 3 -- 18 次循环
            AllTable.ForEach(item => Count *= item.Count);

            //执行循环
            for (int i = 0; i < Count; ++i)
            {
                //定义变量接受每个子组合随机抽取的<List<DataTable>>
                var TempList = new List<DataTable>();

                //下面这个算法,我也不懂。。。现在只会用,如果有大神知道,请指点
                int j = 1;
                AllTable.ForEach(item =>
                {
                  j *= item.Count;
                  TempList.Add(item[(i / (Count / j)) % item.Count]);
                });

                //将随机抽取产生的<List<DataTable>>添加到变量ResultList中
                ResultList.Add(TempList);
            }
            //程序执行完毕,返回结果值
            return ResultList;
      }

cccNew 发表于 2014-8-18 10:51:11

新人求罩
页: [1]
查看完整版本: 通用泛型,迪卡尔积算法分享