改变数组大小

55 c# arrays size

声明后是否可以更改数组大小?如果没有,是否有任何替代阵列?
我不想创建一个大小为1000的数组,但是当我创建它时我不知道数组的大小.

Chr*_*ain 66

您可以使用Array.Resize(),在MSDN中记录.

但是,我同意Corey,如果你需要一个动态大小的数据结构,我们就List可以做到这一点.

重要提示:Array.Resize() 不调整数组大小(方法名称具有误导性),它会创建一个新数组,并且只替换传递给方法的引用.

一个例子:

var array1 = new byte[10];
var array2 = array1;
Array.Resize<byte>(ref array1, 20);

// Now:
// array1.Length is 20
// array2.Length is 10
// Two different arrays.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,Array.Resize不保留您的引用.相反,它会创建一个所需大小的新数组. (7认同)
  • `List <T>`在幕后使用一个数组,因此在C#中使用数组的原因很少.可以使用以下构造函数将列表初始化为合适的大小:http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx.但是,是的,如果你的心脏被置于阵列上,最好尽可能不经常调整它们的大小. (5认同)
  • `List &lt;Int&gt;`正在使用Array.Resize。它在幕后使用了一个通用的(尽管不是通用的)最佳算法,其中,每次增长数组时,数组的大小都会加倍。除非您使用高性能实时系统(例如,高速交易或机械控制系统),否则应使用“ List &lt;Int&gt;”,因为它将“足够好”并且更易于维护。 (2认同)

Cor*_*old 53

不,请尝试使用强类型列表.

例如:

而不是使用

int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);
Run Code Online (Sandbox Code Playgroud)

列表使用数组来存储数据,因此您可以LinkedList通过添加和删除项目来获得数组的速度优势,而无需担心必须手动更改其大小.

这并不意味着数组的大小(在本例中为a List)不会改变 - 因此手动强调单词.

一旦你的数组达到预定义的大小,JIT将在堆上分配一个两倍大小的新数组并复制你现有的数组.

  • 是这样: string[] arr1 = new string[]{}; Array.Resize(ref arr1, 7); (2认同)

Der*_*erp 10

您可以Array.Resize()在.net 3.5及更高版本中使用.此方法分配具有指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组.(因此,您可能需要两个阵列都可用的内存,因为这可能Array.Copy在封面下使用)

  • 出于某种原因,我只能在自己的帖子上看到添加评论 (5认同)

小智 8

是的,可以调整数组的大小。例如:

int[] arr = new int[5];
// increase size to 10
Array.Resize(ref arr, 10);
// decrease size to 3
Array.Resize(ref arr, 3);
Run Code Online (Sandbox Code Playgroud)

如果您使用 CreateInstance() 方法创建数组,则 Resize() 方法不起作用。例如:

// create an integer array with size of 5
var arr = Array.CreateInstance(typeof(int), 5);
// this not work
Array.Resize(ref arr, 10);
Run Code Online (Sandbox Code Playgroud)

数组大小不是动态的,即使我们可以调整它的大小。如果你想要一个动态数组,我认为我们可以使用泛型 List 来代替。

var list = new List<int>();
// add any item to the list
list.Add(5);
list.Add(8);
list.Add(12);
// we can remove it easily as well
list.Remove(5);
foreach(var item in list)
{
  Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)


KbM*_*anu 6

将此方法用于字节数组:

原来:

byte[] bytes = new byte[0];
Run Code Online (Sandbox Code Playgroud)

必要时(需要提供原始长度进行扩展):

Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);
Run Code Online (Sandbox Code Playgroud)

重启:

Array.Resize<byte>(ref bytes, 0);
Run Code Online (Sandbox Code Playgroud)

键入列表方法

原来:

List<byte> bytes = new List<byte>();
Run Code Online (Sandbox Code Playgroud)

必要时:

bytes.AddRange(new byte[length]);
Run Code Online (Sandbox Code Playgroud)

释放/清除:

bytes.Clear()
Run Code Online (Sandbox Code Playgroud)


Joh*_*ers 5

List<T>改用.例如,而不是一组int

private int[] _myIntegers = new int[1000];
Run Code Online (Sandbox Code Playgroud)

使用

private List<int> _myIntegers = new List<int>();
Run Code Online (Sandbox Code Playgroud)

后来

_myIntegers.Add(1);
Run Code Online (Sandbox Code Playgroud)


sgo*_*les 5

在C#中,无法动态调整数组大小.

  • 一种方法是使用 System.Collections.ArrayList而不是a native array.

  • 另一个(更快)的解决方案是重新分配具有不同大小的数组,并将旧数组的内容复制到新数组.

    通用函数resizeArray(如下)可用于执行此操作.

    public static System.Array ResizeArray (System.Array oldArray, int newSize)  
        {
          int oldSize = oldArray.Length;
          System.Type elementType = oldArray.GetType().GetElementType();
          System.Array newArray = System.Array.CreateInstance(elementType,newSize);
    
          int preserveLength = System.Math.Min(oldSize,newSize);
    
          if (preserveLength > 0)
          System.Array.Copy (oldArray,newArray,preserveLength);
    
         return newArray; 
      }  
    
     public static void Main ()  
           {
            int[] a = {1,2,3};
            a = (int[])ResizeArray(a,5);
            a[3] = 4;
            a[4] = 5;
    
            for (int i=0; i<a.Length; i++)
                  System.Console.WriteLine (a[i]); 
            }
    
    Run Code Online (Sandbox Code Playgroud)