|
|
重新调整数组长度 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
重新调整数组长度 在.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 显然这个结果不是我们要的。 如果是三维,多维呢?参照二维。 
|
|
相关文章:相关软件: |
|