马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

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

[复制链接]
查看3821 | 回复1 | 2014-8-18 10:26:07 | 显示全部楼层 |阅读模式
本帖最后由 飞/可爱朋 于 2014-8-18 10:43 编辑

[C#] 纯文本查看 复制代码
/// <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 | 显示全部楼层
新人求罩
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则