任意List的笛卡爾乘積算法

 1         /// <summary>
 2         /// 笛卡爾乘積
 3         /// </summary>
 4         /// <typeparam name="listItem">實體類型</typeparam>
 5         /// <param name="lstSplit"></param>
 6         /// <returns></returns>
 7         public static List<List<T>> CartesianProduct<T>(List<List<T>> lstSplit)
 8         {
 9 
10             var lstResult = new List<List<listItem>>();
11 
12             if (lstSplit.Count <= 1)
13             {
14                 lstSplit.ForEach(item1 =>
15                     {
16                         item1.ForEach(item2 =>
17                             {
18                                 var lstTemp = new List<listItem>();
19                                 lstTemp.Add(item2);
20                                 lstResult.Add(lstTemp);//(new List<listItem>().Add(item2));
21                             });
22                         //foreach (var item2 in item1)
23                         //{
24                         //    var lstTemp = new List<listItem>();
25                         //    lstTemp.Add(item2);
26                         //    lstResult.Add(lstTemp);//(new List<listItem>().Add(item2));
27                         //}
28                     });
29             }
30             else
31             {
32                 int count = 1;
33                 //foreach (var item in lstSplit)
34                 //{
35                 //    count *= item.Count;
36                 //}
37                 lstSplit.ForEach(item => count *= item.Count);
38                 //count = lstSplit.Aggregate(1, (result, next) => result * next.Count);
39                 for (int i = 0; i < count; ++i)
40                 {
41                     var lstTemp1 = new List<listItem>();
42                     int j = 1;
43                     //foreach (var item in lstSplit)
44                     //{
45                     //    j *= item.Count;
46                     //    lstTemp.Add(item[(i / (count / j)) % item.Count]);
47                     //}
48                     lstSplit.ForEach(item =>
49                     {
50                         j *= item.Count;
51                         lstTemp1.Add(item[(i / (count / j)) % item.Count]);
52                     });
53                     lstResult.Add(lstTemp1);
54                 }
55             }
56             return lstResult;
57         }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章