IT TIP

배열 크기 변경

itqueen 2021. 1. 9. 11:10
반응형

배열 크기 변경


선언 후 배열 크기를 변경할 수 있습니까? 그렇지 않은 경우 어레이에 대한 대안이 있습니까?
크기가 1000 인 배열을 만들고 싶지 않지만 배열을 만들 때 크기를 알지 못합니다.


아니요, 대신 강력한 형식의 목록을 사용해보십시오 .

예를 들면 :

사용하는 대신

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

다음과 같이 할 수 있습니다.

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

목록은 배열을 사용하여 데이터를 저장하므로 수동으로 크기를 변경할 LinkedList필요없이 항목을 추가 및 제거 할 수 있으므로 편리하게 배열의 속도 이점을 얻을 수 있습니다 .

이것은 배열의 크기 (이 경우 a List)가 변경 되지 않았 음을 의미하지는 않습니다. 따라서 수동으로 단어를 강조합니다.

어레이가 미리 정의 된 크기에 도달하면 JIT는 크기의 두 배인 힙에 새 어레이를 할당하고 기존 어레이를 복사합니다.


MSDN에Array.Resize() 문서화 된을 사용할 수 있습니다 .

하지만 네, Corey의 의견에 동의합니다. 동적 크기의 데이터 구조가 필요한 경우이를 List위한 s가 있습니다.

중요 : 배열의 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.

Array.Resize().net 3.5 이상에서 사용할 수 있습니다 . 이 메서드는 지정된 크기의 새 배열을 할당하고 이전 배열의 요소를 새 배열로 복사 한 다음 이전 배열을 새 배열로 바꿉니다. (따라서 Array.Copy덮개 아래에서 사용할 수 있으므로 두 어레이 모두에 사용할 수있는 메모리가 필요합니다. )


바이트 배열에이 접근 방식을 사용했습니다.

처음에는 :

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()

System.Collections.Generic.List 사용


List<T>대신 사용하십시오 . 예를 들어, int 배열 대신

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

사용하다

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

나중

_myIntegers.Add(1);

C #에서는 배열의 크기를 동적으로 조정할 수 없습니다.

  • 한 가지 방법은 사용하는 것입니다 System.Collections.ArrayList대신 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]); 
            }
    

C #에서는 Array.Resize배열의 크기를 새 크기로 조정하는 가장 간단한 방법입니다. 예 :

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

여기에서 LinkButton 배열의 배열 크기를 조정하고 싶습니다.

<LinkButton>= 배열 유형 지정
ref area= ref는 키워드이고 'area'는 배열 이름
size= 새 크기 배열


예, 배열의 크기를 조정할 수 있습니다. 예를 들면 :

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);

배열 크기는 동적이 아니며 크기를 조정할 수도 있습니다. 동적 배열을 원하면 대신 일반 목록을 사용할 수 있다고 생각합니다.

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);
}

    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;
    }

Use a List (where T is any type or Object) when you want to add/remove data, since resizing arrays is expensive. You can read more about Arrays considered somewhat harmful whereas a List can be added to New records can be appended to the end. It adjusts its size as needed.

A List can be initalized in following ways

Using collection initializer.

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

Using var keyword with collection initializer.

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

Using new array as parameter.

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

Using capacity in constructor and assign.

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";

Using Add method for each element.

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

Thus for an Object List you can allocate and assign the properties of objects inline with the List initialization. Object initializers and collection initializers share similar syntax.

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

Initialize list with collection initializer.

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

Initialize list with new objects.

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

This worked well for me to create a dynamic array from a class array.

var s = 0;
var songWriters = new SongWriterDetails[1];
foreach (var contributor in Contributors)
{
    Array.Resize(ref songWriters, s++);
    songWriters[s] = new SongWriterDetails();
    songWriters[s].DisplayName = contributor.Name;
    songWriters[s].PartyId = contributor.Id;
    s++;
}

In case you cannot use Array.Reset (the variable is not local) then Concat & ToArray helps:

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

If you really need to get it back into an array I find it easiest to convert the array to a list, expand the list then convert it back to an array.

        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.

Use a generic List (System.Collections.Generic.List).

ReferenceURL : https://stackoverflow.com/questions/4840802/change-array-size

반응형