在C#中使用Redim Preserve?

JL.*_*JL. 36 c# arrays

我很惊讶今天发现C#不支持动态大小的数组.那么VB.NET开发人员如何使用ReDim Preserve在C#中处理这个问题呢?

在函数的开头我不确定数组的上限.这取决于从数据库返回的行.

Jon*_*eet 75

VB.NET也没有动态大小的数组的想法--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
    }
}
Run Code Online (Sandbox Code Playgroud)

证明这相当于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
Run Code Online (Sandbox Code Playgroud)

这两个计划是等效的.

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

  • 这些技术之间存在一个区别.Array.Resize仅适用于从零开始的单维数组.Redim适用于多维数组.对零基础部分不确定 (7认同)

Mic*_*l L 11

请改用ArrayLists或Generics

  • 更确切地说,使用List <T>..NET中有许多通用类或函数,它们不是可调整大小的数组.;) (9认同)
  • [@JonSkeet](http://stackoverflow.com/users/22656/jon-skeet) [已回答](http://stackoverflow.com/a/327958/2040663) 与 ReDim Preserve 完全相同。 (2认同)

dri*_*iis 10

使用List <T>.它将根据需要动态调整大小.


Jon*_*len 6

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

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

x = (int[]) Utils.CopyArray((Array) x, new int[10]);
Run Code Online (Sandbox Code Playgroud)