Redim在C#中保留?

我很震惊地发现,C#不支持dynamic大小的数组。 那么VB.NET开发人员如何使用ReDim Preserve在C#中处理这个问题呢?

在function的开始我不确定数组的上限。 这取决于从数据库返回的行。

改用ArrayLists或generics

VB.NET没有dynamic大小的数组的想法,CLR不支持它。

“Redim Preserve”的等价物是Array.Resize<T> – 但您必须注意,如果还有其他对原始数组的引用,它们将不会被更改。 例如:

 using System; class Foo { static void Main() { string[] x = new string[10]; string[] y = x; Array.Resize(ref x, 20); Console.WriteLine(x.Length); // Prints out 20 Console.WriteLine(y.Length); // Still prints out 10 } } 

certificate这相当于Redim Preserve:

 Imports System Class Foo Shared Sub Main() Dim x(9) as String Dim y as String() = x Redim Preserve x(19) Console.WriteLine(x.Length) Console.WriteLine(y.Length) End Sub End Class 

这两个程序是相同的。

如果你真的想要一个dynamic大小的集合,你应该使用List<T> (或类似的东西)。 直接使用数组存在各种问题 – 请参阅Eric Lippert的博客文章以获取详细信息。 这并不是说你应该总是避免它们,但是你需要知道你在处理什么。

使用一个List <T>。 它将根据需要dynamicresize。

你真的不应该使用ReDim,它可以是昂贵的。 我更喜欢List(Of T),但在这方面有很多select。

这就是说,你有一个问题,这是你的答案。

 x = (int[]) Utils.CopyArray((Array) x, new int[10]); 

只是为了好玩,下面是一种使用generics的方法,以便redim /扩展一维数组(添加一个“row”):

 static T[] Redim<T>(T[] arr, bool preserved) { int arrLength = arr.Length; T[] arrRedimed = new T[arrLength + 1]; if (preserved) { for (int i = 0; i < arrLength; i++) { arrRedimed[i] = arr[i]; } } return arrRedimed; } 

还有一个添加n行(尽pipe这不会阻止用户缩小数组,这将在for循环中引发错误):

 static T[] Redim<T>(T[] arr, bool preserved, int nbRows) { T[] arrRedimed = new T[nbRows]; if (preserved) { for (int i = 0; i < arr.Length; i++) { arrRedimed[i] = arr[i]; } } return arrRedimed; } 

我相信你明白了。

对于一个multidimensional array(二维),这里有一个可能性:

 static T[,] Redim<T>(T[,] arr, bool preserved) { int Ubound0 = arr.GetUpperBound(0); int Ubound1 = arr.GetUpperBound(1); T[,] arrRedimed = new T[Ubound0 + 1, Ubound1]; if (preserved) { for (int j = 0; j < Ubound1; j++) { for (int i = 0; i < Ubound0; i++) { arrRedimed[i, j] = arr[i, j]; } } } return arrRedimed; } 

在你的程序中,使用这个或甚至没有指定的types,编译器会识别它:

 int[] myArr = new int[10]; myArr = Redim<int>(myArr, true); 

要么

 int[] myArr = new int[10]; myArr = Redim(myArr, true); 

不知道这一切是否真的相关。 = D请随时纠正我或改善我的代码。 ;)

我不禁注意到,上面的答案都没有涉及multidimensional array的概念。 这就是说,这里是一个例子。 有问题的数组被预定义为x

 int[,] temp = new int[newRows, newCols]; int minRows = Math.Min(newRows, x.GetUpperBound(0) + 1); int minCols = Math.Min(newCols, x.GetUpperBound(1) + 1); for (int i = 0; i < minRows ; ++i) for (int j = 0; j < minCols; ++j) temp[i, j] = x[i, j]; x = temp; 

即使很久以前,它可能会帮助寻找一个简单的解决scheme的人 – 我发现在另一个论坛上很棒的东西:

 //from Applied Microsoft.NET framework Programming - Jeffrey Richter public static Array RedimPreserve(Array origArray, Int32 desiredSize) { System.Type t = origArray.GetType().GetElementType(); Array newArray = Array.CreateInstance(t, desiredSize); Array.Copy(origArray, 0, newArray, 0, Math.Min(origArray.Length, desiredSize)); return newArray; } 

资料来源: https : //social.msdn.microsoft.com/Forums/zh-CN/6759816b-d525-4752-a3c8-9eb5f4a5b194/redim-in-c?forum=csharplanguage