改变数组大小

时间:2011-01-30 02:38:24

标签: c# arrays size

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

15 个答案:

答案 0 :(得分:60)

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

但是,我同意Corey的意见,如果你需要一个动态大小的数据结构,那我们就有List个。

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

一个例子:

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.

答案 1 :(得分:52)

不,请尝试使用强类型List

例如:

而不是使用

int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;

你可以这样做:

List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);

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

这并不意味着数组的大小(在这种情况下,List)不会改变 - 因此强调手动一词。

只要数组达到预定义的大小,JIT就会在堆上分配一个大小为两倍的新数组并复制现有数组。

答案 2 :(得分:10)

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

答案 3 :(得分:6)

将此方法用于字节数组:

最初:

byte[] bytes = new byte[0];

必要时(需要提供原始长度以便延长):

Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);

复位:

Array.Resize<byte>(ref bytes, 0);

输入列表方法

最初:

List<byte> bytes = new List<byte>();

必要时:

bytes.AddRange(new byte[length]);

推出/清除:

bytes.Clear()

答案 4 :(得分:5)

答案 5 :(得分:5)

请改用List<T>。例如,而不是一个int数组

private int[] _myIntegers = new int[1000];

使用

private List<int> _myIntegers = new List<int>();

_myIntegers.Add(1);

答案 6 :(得分:5)

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

  • 一种方法是使用 System.Collections.ArrayList 代替 一个 native array

  • 另一个(更快)的解决方案是 用a重新分配数组 不同的大小和复制 旧数组的内容为新的 阵列。

    通用功能 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]); 
            }
    

答案 7 :(得分:4)

在C#中,Array.Resize是将任何数组调整为新大小的最简单方法,例如:

Array.Resize<LinkButton>(ref area, size);

在这里,我想调整LinkBut​​ton数组的数组大小:

<LinkButton> =指定数组类型
ref area = ref是关键字,'area'是数组名称
size =新大小的数组

答案 8 :(得分:4)

是的,可以调整阵列大小。例如:

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

如果使用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);

数组大小不是动态的,即使我们可以调整它的大小。如果你想要一个动态数组,我想我们可以使用通用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);
}

答案 9 :(得分:3)

    private void HandleResizeArray()
    {
        int[] aa = new int[2];
        aa[0] = 0;
        aa[1] = 1;

        aa = MyResizeArray(aa);
        aa = MyResizeArray(aa);
    }

    private int[] MyResizeArray(int[] aa)
    {
        Array.Resize(ref aa, aa.GetUpperBound(0) + 2);
        aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0);
        return aa;
    }

答案 10 :(得分:1)

如果要添加/删除数据,请使用List(其中T是任何类型或对象),因为调整数组大小非常昂贵。您可以阅读有关Arrays considered somewhat harmful的更多信息,而可以将新记录添加到新记录中。它根据需要调整其大小。

列表可以通过以下方式初始化

使用集合初始化程序。

List<string> list1 = new List<string>()
{
    "carrot",
    "fox",
    "explorer"
};

将var关键字与集合初始值设定项一起使用。

var list2 = new List<string>()
{
    "carrot",
    "fox",
    "explorer"
};

使用新数组作为参数。

string[] array = { "carrot", "fox", "explorer" };
List<string> list3 = new List<string>(array);

在构造函数中使用容量并分配。

List<string> list4 = new List<string>(3);
list4.Add(null); // Add empty references. (Not Recommended)
list4.Add(null);
list4.Add(null);
list4[0] = "carrot"; // Assign those references.
list4[1] = "fox";
list4[2] = "explorer";

为每个元素使用Add方法。

List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("explorer");

因此,对于对象列表,您可以使用列表初始化内联分配和分配对象的属性。对象初始值设定项和集合初始值设定项具有相似的语法。

class Test
{
    public int A { get; set; }
    public string B { get; set; }
}

使用集合初始化程序初始化列表。

List<Test> list1 = new List<Test>()
{
    new Test(){ A = 1, B = "Jessica"},
    new Test(){ A = 2, B = "Mandy"}
};

使用新对象初始化列表。

List<Test> list2 = new List<Test>();
list2.Add(new Test() { A = 3, B = "Sarah" });
list2.Add(new Test() { A = 4, B = "Melanie" });

答案 11 :(得分:0)

这对我来说很适合从类数组创建一个动态数组。

> iris %>% mutate(stDev = apply(.[1:4], 1, sd)) %>% head
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species    stDev
1          5.1         3.5          1.4         0.2  setosa 2.179449
2          4.9         3.0          1.4         0.2  setosa 2.036950
3          4.7         3.2          1.3         0.2  setosa 1.997498
4          4.6         3.1          1.5         0.2  setosa 1.912241
5          5.0         3.6          1.4         0.2  setosa 2.156386
6          5.4         3.9          1.7         0.4  setosa 2.230844

> iris %>% mutate(stDev = apply(iris[1:4], 1, sd)) %>% head
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species    stDev
1          5.1         3.5          1.4         0.2  setosa 2.179449
2          4.9         3.0          1.4         0.2  setosa 2.036950
3          4.7         3.2          1.3         0.2  setosa 1.997498
4          4.6         3.1          1.5         0.2  setosa 1.912241
5          5.0         3.6          1.4         0.2  setosa 2.156386
6          5.4         3.9          1.7         0.4  setosa 2.230844

答案 12 :(得分:0)

如果无法使用Array.Reset(变量不是本地变量),那么ConcatToArray可以帮助您

anObject.anArray.Concat(new string[] { newArrayItem }).ToArray();

答案 13 :(得分:0)

如果您真的需要将其返回到数组中,我发现将array转换为list最简单,请展开列表,然后将其转换回array。 / p>

        string[] myArray = new string[1] {"Element One"};
        // Convert it to a list
        List<string> resizeList = myArray.ToList();
        // Add some elements
        resizeList.Add("Element Two");
        // Back to an array
        myArray = resizeList.ToArray();
        // myArray has grown to two elements.

答案 14 :(得分:-1)

使用通用列表(System.Collections.Generic.List)。