重新调整数组长度
在.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
显然这个结果不是我们要的。
如果是三维,多维呢?参照二维。