重新调整数组长度

类别:.NET开发 点击:0 评论:0 推荐:
                              重新调整数组长度
在.net中数组长度不是不可以调整的,其实只需用Array的静态方法CreateInstance动态的创建一个数组,然后把数据再
拷贝过来。
 先看看一维数组(以int型为例):
   public class app
    {
                  [STAThread]
   static void Main(string[] args)
   {
                  int[] arr=new int[]{1,2,3};
                  PrintValues( arr );                 
    arr=(int[])Redim(arr,5);
                  PrintValues( arr );
    arr=(int[])Redim(arr,4);
    PrintValues( arr );
                 }
               //调整长度
               public static Array Redim(Array origArray,int length)
               {
                   //确定每个元素的类型
                   Type t=origArray.GetType().GetElementType();
                   //创建新的数组
     Array newArray=Array.CreateInstance(t,length));
                   //原数组中的数据拷贝到新数组中
     Array.Copy(origArray,0,newArray,0,Math.Min(origArray.Length,length)));
     return newArray;
               }
               //输出数据
               public static void PrintValues( Array myArr ) 
  {
   System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
   int i = 0;   
   int cols = myArr.GetLength( myArr.Rank - 1 );
   while ( myEnumerator.MoveNext() ) 
   {
    if ( i < cols ) 
    {
     i++;
    }
    else 
    {
     Console.WriteLine();
     i = 1;
    }
    Console.Write( "\t{0}", myEnumerator.Current );
   }
   Console.WriteLine();
  }
  }
输出结果为:1,2,3
            1,2,3,0,0
            1,2,3,0
以上是一维数组的,如果是二维数组或多维数组呢?
在二维数组后面加一列;
 public class app
    {
                  [STAThread]
   static void Main(string[] args)
   {
                  //创建了一个int型的二维数组
                  int[,] my2DArray=(int[,])Array.CreateInstance( typeof(int), 2, 3 );
   for ( int i = my2DArray.GetLowerBound(0); i <= my2DArray.GetUpperBound(0); i++ )
    for ( int j = my2DArray.GetLowerBound(1); j <= my2DArray.GetUpperBound(1); j++ )     
      my2DArray.SetValue( i + j , i, j );
                   PrintValues( my2DArray) ;
                   Console.WriteLine();
                   my2DArray=(int[,])Redim(my2DArray,2,4);
     PrintValues( my2DArray );
                   my2DArray=(int[,])Redim(my2DArray,2,2);
     PrintValues( my2DArray );
                 }
               //调整长度
               public static Array Redim(Array origArray,params int[] lengths)
               {
                   //确定每个元素的类型
                   Type t=origArray.GetType().GetElementType();
                   //创建新的数组
     Array newArray=Array.CreateInstance(t,lengths)));
                   //原数组中的数据拷贝到新数组中
     for ( int i = origArray.GetLowerBound(0); i <= Math.Min(origArray.GetUpperBound(0),newArray.GetUpperBound(0)); i++ )
    for ( int j = origArray.GetLowerBound(1); j <= Math.Min(origArray.GetUpperBound(1),newArray.GetUpperBound(1)); j++ )     
     newArray.SetValue( origArray.GetValue( i, j ) , i, j );
                   //在这里没有用Copy方法,如果用此方法,会把原数组中所有数据逐个拷贝到新数组中                  
     return newArray;
               }
               //输出数据
               public static void PrintValues( Array myArr ) 
  {
   System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
   int i = 0;   
   int cols = myArr.GetLength( myArr.Rank - 1 );
   while ( myEnumerator.MoveNext() ) 
   {
    if ( i < cols ) 
    {
     i++;
    }
    else 
    {
     Console.WriteLine();
     i = 1;
    }
    Console.Write( "\t{0}", myEnumerator.Current );
   }
   Console.WriteLine();
  }
  }
输出结果为:0,1,2
            1,2,3
            0,1,2,0,0
            1,2,3,0,0
            0,1
            1,2
如果在Redim方法中用Copy方法
稍微改动一下 Redim方法
                 public static Array Redim(Array origArray,params int[] lengths)
  {
                        int length=1;
   for(int i=0;i<lengths.Length;i++)
                        length*=lengths[i];
          Type t=origArray.GetType().GetElementType();
   Array newArray=Array.CreateInstance(t,lengths); 
                        Array.Copy(origArray,0,newArray,0,Math.Min(origArray.Length,length));
                        return newArray;
                }  
输出结果为:0,1,2
            1,2,3
            0,1,2,1
            2,3,0,0
            0,1
            2,1
显然这个结果不是我们要的。
如果是三维,多维呢?参照二维。
           

本文地址:http://com.8s8s.com/it/it42700.htm