C #에서 알 수없는 길이의 배열


81

방금 C #을 배우기 시작했고 배열 소개에서 변수를 배열로 설정하는 방법을 보여 주었지만 할당시 배열의 길이를 지정해야하는 것 같습니다. 정렬?

답변:


115

배열에는 길이가 지정되어야합니다. 여러 요소를 허용하려면 List클래스를 사용하십시오 .

예를 들면 :

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3

3
List<int[]> myInts = new List<int[]>();작동 할 수 있습니다.
Nicolas Tyler

1
배열에 길이를 할당해야하는 경우 왜 이렇게 할 수 있습니까? String [] arr = "test; the; values; now".Split ( ';'); 그리고 그것은 단지 길이를 결정합니까? 그러나 동일한 코드 줄을 사용하여 변수 선언을 다른 줄로 이동할 수는 없습니다.
matthew_360

@ matthew_360 split 함수 내에서 배열은 실제로 고정 된 크기로 호출됩니다. 예 : referencesource.microsoft.com/#mscorlib/system/…
Hutch

귀하의 응답과 관련하여 "Arrays must be assigned a length"- static외부의 메서드 Main()에서 선언을 String[] tokens = null하고 초기화하지 않았지만 어떻게 오류 "Hello.World".Split('.')없이 호출 할 수 System.NullReferenceException있었습니까?
민 트란

40

List<>길이를 알 수없는 '배열'을 만드는 데 사용 합니다.

.가 List<>.ToArray()아닌 실제 배열을 반환하는 데 사용 합니다 List.

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();

나를 위해 List는 알 수없는 크기의 문제를 해결 한 다음 .ToArray ()가 필요한 배열을 만들었습니다.
dev1998 2015

2
System.Collections.Generic 사용;
PodTech.io

20

약간의 배경 정보 :

말했듯이, 동적 컬렉션을 원하면 List<T>. 내부적으로 List는 스토리지에도 배열을 사용합니다. 이 배열은 다른 배열과 마찬가지로 고정 된 크기를 갖습니다. 배열이 크기가있는 것으로 선언되면 변경되지 않습니다. 에 항목을 List추가하면 배열에 추가됩니다. 처음에는 List길이가 16이라고 생각하는 배열로 시작합니다. 17 번째 항목을에 추가하려고 List하면 새 배열이 할당되며 이는 이전 배열의 두 배인 것 같습니다. , 그래서 32 항목. 그런 다음 이전 배열의 내용이 새 배열로 복사됩니다. 따라서 List외부 관찰자에게는 동적으로 보일 수 있지만 내부적으로는 규칙도 준수해야합니다.

그리고 짐작 하셨겠지만, 배열의 복사 및 할당은 자유롭지 않으므로 가능한 한 적은 수를 목표로해야 List하며 배열의 초기 크기를 (의 생성자에서 ) 지정할 수 있습니다 . 완벽한 시나리오에서는 원하는 모든 것을 담을 수있을만큼 충분히 큽니다. 그러나 이것은 마이크로 최적화이며 그것이 당신에게 중요하지 않을 것 같지만 실제로 무엇을하고 있는지 아는 것은 항상 좋습니다 .


1
이것이 바로 내가 추구했던 정보입니다. 대부분의 다른 답변보다 더 많은 정보를 제공합니다. +1
Carrie Kendall

16

크기가 변수로 설정된 배열을 만들 수 있습니다.

int size = 50;
string[] words = new string[size]; // contains 50 strings

그러나 100 단어가 필요하다고 결정하면 나중에 그 크기를 변경할 수 없습니다. 크기가 정말 동적이어야하는 경우 다른 종류의 데이터 구조를 사용해야합니다. 시험List .


모두 null입니다. 시도 string[] words = new string(',', size - 1).Split(',');그들이로 초기화하고 지금 "".
Bitterblue 2014 년

3

ArrayList.NET 1.x에서 if를 사용 하거나List<yourtype> .NET 2.0 또는 3.x .

System.Collections및 에서 검색하십시오 System.Collections.Generics.


2

데이터가 고유 한 경우 사전을 살펴볼 수도 있습니다. 그러면 작업 할 두 개의 열이 제공됩니다.

사용자 이름, 총 청구서

값만 검색하고 업데이트 할 수있는 많은 내장 도구를 제공합니다.


1
var yummy = new List<string>();
while(person.FeelsHappy()) {
    yummy.Add(person.GetNewFavoriteFood());
}
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count);
Console.WriteLine("I didn't even need to know how big to make it " +
    "until I finished making it!");


1

간단히 말해 컬렉션 및 제네릭을 사용하십시오.

모든 C # 개발자에게 필수이며 배우는 데 시간을 할애 할 가치가 있습니다. :)


1

위에서 자세히 설명했듯이 일반 List <>가 가장 좋은 방법입니다.

.NET 1. *에 갇혀 있다면 대신 ArrayList 클래스를 사용해야합니다. 이것은 컴파일 타임 유형 검사가 없으며 캐스팅을 추가해야합니다.

후속 버전은 스레드 안전 변형을 포함하여 다양한 변형을 구현했습니다.


1

목록 대신 배열을 사용해야하는 경우 런타임에 크기가 계산되는 배열을 만들 수 있습니다.

예를 들어 n x n 크기의 2 차원 배열을 원합니다. n은 런타임에 사용자로부터 얻습니다.

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];

1 차원 배열의 경우 비슷하게 다음과 같이 작성합니다. var x = new int [n];
Ken Janka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.