在C#程序中后期如何调整数组大小

4

我不确定在c#中是否可以实现这一点,但我有一个变量定义在

 public partial class Form1 : Form
 {...
   ...
    #region used variables
    public ulong[] logP = {0,0,0,0,0,0,0,0}
  ....
  ..

然后,在程序的后期,我想要在主程序启动并进行一些计算之前,有一个选项来调整程序中的大小。
因为我喜欢使用各种数字集和数组大小进行测试,所以我希望在每个测试中都有调整数组大小的选项(但这个数组不限于单个过程,它是一个需要可调整大小的全局变量)。
由于整个程序在各个部分都在使用这个数组(在各种函数下),我应该如何处理这部分?
    ulong [] sumP = new ulong[numericupdown.valeu];

那么它会改变这个全局变量的大小吗?

为什么不使用 List<ulong> - Daniel A. White
考虑使用List而不是数组。 - Icemanind
数组不可调整大小。就这些。 - Ed S.
数组可以是多维的,而列表则不行。在我的情况下,我使用了一些相当复杂的数学,这就是我不使用列表的原因。当然,最终我可以重新设计所有内容并更改程序以使用列表,但那需要太多的更改。 - user613326
4个回答

21

无法调整数组大小;您必须声明一个所需大小的新数组并将原始数组的内容复制到新数组中。

更新:我不喜欢 Array.Resize - 它不会调整数组大小(正如方法名所暗示的那样),而是创建一个新数组并替换引用:

    static void Main(string[] args)
    {
        int[] a1 = new int[] { 1, 2, 3 };
        int[] a2 = a1;

        Console.WriteLine("A1 Length: {0}", a1.Length); // will be 3
        Console.WriteLine("A2 Length: {0}", a2.Length); // will be 3
        Array.Resize(ref a1, 10);
        Console.WriteLine("A1 Length: {0}", a1.Length); // will be 10
        Console.WriteLine("A2 Length: {0}", a2.Length); // will be 3 - not good

        Console.ReadLine();
    }

4
请参考 MSDN 文档中的 Array.Resize - staafl
1
有趣,我以前不知道这个 - 它只是我描述的快捷方式,但是它会保留对原始数组的任何其他引用,就像我在更新中描述的那样。 - Moho
换句话说,无论方法的名称如何,您都不会调整数组大小,而是替换数组。 - Moho
+1 证明了(ref x)关键字会得到一个新实例。原始数组不会被调整大小。这表明数组本身无法调整大小(与alloc/mallocs相同)。唯一让你认为它正在调整大小的是因为它也复制了内容。我想知道为什么其他人会对此投反对票... :) - Jeroen van Langen

0

3
请查看下面我被踩的回答,了解为什么这不会调整数组大小。 - Moho

0
    class Program
    {
       static void Main(string[] args)
       {
        var myArr = new int[5] { 1, 2, 3, 4, 5 };
        Array.Resize(ref myArr, 10);
        for (int i = 0; i < myArr.Length; i++)
        {
            Console.WriteLine("   [{0}] : {1}", i, myArr[i]);
        }
        Console.ReadLine();
    }
}

0
如icemanind建议的那样-考虑使用一个List数组,但是作为更好的实践,请确保将数组容量初始化为一个合理的数量,例如:
List<string> myList = new List<string>(10); // initial capacity is 10

优点是性能和空间分配是预定义的,这并不意味着每次添加一个项时都需要重新创建集合,因为它会使用现有分配的数量直到达到限制,然后在内部增加。


5
"初始长度为10",不是容量,长度是“零”。 - Jeroen van Langen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接