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 }