笛卡儿积
在进行商品属性模块设计的时候,同一个商品可能有不同的属性,不同值,这个时候,就会进行不同的组合,于是就产生了SKU的概念,在这里比如说某个用户选择了一个商品了,这个商品与如下的属性和值,例如:以1开头的是一种属性,"_"后边的为属性值,以此类推,那么可以组成多少个不同的组合?,组合一:1_22&2_4&6_333&7_77.....怎么用程序去实现呢?
1 //产生的集合,这个集合的属性个数是不确定的 2 List<string> listStrs = new List<string>() 3 { 4 "1_22", 5 "1_33", 6 "1_34", 7 "2_4", 8 "2_32", 9 "2_54", 10 //"6_333", 11 //"6_66", 12 //"7_77", 13 //"7_89" 14 }; 15 //先分组 16 var groups = from str in listStrs 17 group str by str.Split('_')[0] into g 18 select g; 19 20 List<string> strResult = new List<string>();//定义最后的结果集合 21 22 //遍历每个组 23 foreach (var groupStr in groups) 24 { 25 List<string> temp = new List<string>();//定义临时集合 26 foreach (var item in groupStr)//遍历组内的所有的项 27 { 28 if (strResult.Count() <= 0)//如果是第一个分组遍历那么只需要直接将分组的集合放到 临时集合,再放到最终集合 29 { 30 temp.Add(item); 31 } 32 else 33 { 34 //如果是第二个组之后的逻辑那么就 做组内的每个项跟 最终集合做笛卡尔积 35 foreach (var target in strResult)//做最终集合跟 当前组的组合乘积 36 { 37 temp.Add(target + "&" + item);//将项的相乘的结果做成组合项 38 } 39 } 40 } 41 strResult.Clear();//清空之前的数据 42 strResult.AddRange(temp);//将临时集合的数据放到最终的结果集合里去 43 }