1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Runtime.Serialization; 5 using System.Runtime.Serialization.Formatters.Binary; 6 7 namespace ConsoleApplication3 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //要操作的源数组 14 List<int> originalArray = new List<int>(); 15 for (int i = 1; i <= 10; i++) 16 { 17 originalArray.Add(i); 18 } 19 Console.Write("源数组:"); 20 foreach (int item in originalArray) 21 { 22 Console.Write(item + " "); 23 } 24 Console.WriteLine(); 25 //得到指定长度的子数组 26 List<List<int>> resultArray = SubChildArray(originalArray, originalArray.Count - 1); 27 28 for (int i = 0; i < resultArray.Count; i++) 29 { 30 Console.Write("子数组" + (i + 1) + ":"); 31 for (int j = 0; j < resultArray[i].Count; j++) 32 { 33 Console.Write(resultArray[i][j] + " "); 34 } 35 Console.WriteLine(); 36 } 37 38 Console.WriteLine("子数组的数量:" + resultArray.Count); 39 Console.ReadKey(); 40 } 41 /// <summary> 42 /// 得到指定长度的子数组 43 /// </summary> 44 /// <param name="originalArray">源数组</param> 45 /// <param name="arrayLength">要取出子数组的长度</param> 46 /// <returns></returns> 47 static List<List<int>> SubChildArray(List<int> originalArray, int arrayLength) 48 { 49 List<List<int>> result = new List<List<int>>(); 50 List<int> one = new List<int>(); 51 52 for (int i = 0; i < originalArray.Count; i++) 53 { 54 one.Add(originalArray[i]); 55 Add(originalArray.GetRange(i + 1, originalArray.Count - 1 - i), arrayLength - 1, result, one); 56 if (one.Count != 0) 57 one.RemoveAt(one.Count - 1); 58 //这里很可以用one.Clear(); 59 //循环完一次后,就可以清除one,然后再重新开始 60 } 61 return result; 62 } 63 /// <summary> 64 /// 用于递归的函数 65 /// </summary> 66 /// <param name="array"></param> 67 /// <param name="n"></param> 68 /// <param name="result"></param> 69 /// <param name="one"></param> 70 static void Add(List<int> array, int n, List<List<int>> result, List<int> one) 71 { 72 //如果n=0,就表明one的Count属性已等于n 73 if (n == 0) 74 { 75 result.Add(Clone(one) as List<int>); 76 //进行下一次之前,移除最后一个元素 77 one.RemoveAt(one.Count - 1); 78 } 79 else 80 { 81 for (int i = 0; i < array.Count; i++) 82 { 83 one.Add(array[i]); 84 //在这里进行递归,同时n-1 85 Add(array.GetRange(i + 1, array.Count - 1 - i), n - 1, result, one); 86 } 87 //一轮结束后,移除最后一个元素 88 one.RemoveAt(one.Count - 1); 89 } 90 } 91 /// <summary> 92 /// 用来复制对象的函数 93 /// </summary> 94 /// <param name="obj"></param> 95 /// <returns></returns> 96 public static object Clone(object obj) 97 { 98 using (MemoryStream ms = new MemoryStream()) 99 { 100 IFormatter formattor = new BinaryFormatter(); 101 formattor.Serialize(ms, obj); 102 ms.Seek(0, SeekOrigin.Begin); 103 return formattor.Deserialize(ms); 104 } 105 } 106 } 107 }
转自:http://www.cnblogs.com/xiangism/archive/2009/09/06/1561398.html