배열 크기 변경
선언 후 배열 크기를 변경할 수 있습니까? 그렇지 않은 경우 어레이에 대한 대안이 있습니까?
크기가 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
'IT TIP' 카테고리의 다른 글
밑줄이있는이 이름이 CLS 규격이 아닌 이유는 무엇입니까? (0) | 2021.01.09 |
---|---|
.htaccess로 사이트를 리디렉션하지만 하나의 폴더 제외 (0) | 2021.01.09 |
문자열을 문자열 []로 변환하는 방법? (0) | 2021.01.09 |
Java를 C # 코드로 변환하는 도구 (0) | 2021.01.08 |
OAuth 공급자 용 라이브러리 (Java) (0) | 2021.01.08 |