通用泛型,迪卡尔积算法分享
本帖最后由 飞/可爱朋 于 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;
}
新人求罩
页:
[1]