从数组中返回指定长度的子数组[转]

  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

原文地址:https://www.cnblogs.com/qiyebao/p/4530413.html