笛卡儿积

在进行商品属性模块设计的时候,同一个商品可能有不同的属性,不同值,这个时候,就会进行不同的组合,于是就产生了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             }

 

 

posted @ 2012-09-07 11:00  饮酒笑红尘  Views(380)  Comments(0Edit  收藏  举报