[c#] List <T>를 (용량이 아닌) 주어진 크기로 초기화하는 방법은 무엇입니까?

.NET은 성능이 거의 동일한 일반 목록 컨테이너를 제공합니다 (배열 대 목록의 성능 질문 참조). 그러나 초기 화면에서 상당히 다릅니다.

배열은 기본값으로 초기화하기가 매우 쉽고 정의에 따라 이미 특정 크기가 있습니다.

string[] Ar = new string[10];

임의의 항목을 안전하게 할당 할 수 있습니다.

Ar[5]="hello";

목록을 사용하면 더 까다 롭습니다. 동일한 초기화를 수행하는 두 가지 방법을 볼 수 있습니다. 둘 다 우아하다고 부르는 것이 아닙니다.

List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);

또는

string[] Ar = new string[10];
List<string> L = new List<string>(Ar);

더 깨끗한 방법은 무엇입니까?

편집 : 지금까지 답변은 목록을 미리 채우는 것보다 다른 용량을 나타냅니다. 예를 들어, 10 명의 용량으로 방금 생성 된 목록에서L[2]="somevalue"

편집 2 : 사람들은 내가 목록을 사용하려는 방식이 아니기 때문에 왜 이런 식으로 목록을 사용하고 싶은지 궁금합니다. 두 가지 이유를 알 수 있습니다.

  1. 목록이 “차세대”배열이라고 설득력있게 주장 할 수 있으므로 거의 패널티없이 유연성을 추가 할 수 있습니다. 따라서 기본적으로 사용해야합니다. 초기화하기가 쉽지 않을 수 있음을 지적하고 있습니다.

  2. 내가 현재 쓰고있는 것은 더 큰 프레임 워크의 일부로 기본 기능을 제공하는 기본 클래스입니다. 내가 제공하는 기본 기능에서 목록의 크기는 고급으로 알려져 있으므로 배열을 사용할 수 있습니다. 그러나 모든 기본 클래스에 동적으로 확장 할 수있는 기회를 제공하고 싶으므로 목록을 선택합니다.



답변

나는 이것이 자주 필요하다고 말할 수 없습니다. 왜 이것을 원하는지에 대해 더 자세히 설명해 주시겠습니까? 아마도 도우미 클래스의 정적 메서드로 넣을 것입니다.

public static class Lists
{
    public static List<T> RepeatedDefault<T>(int count)
    {
        return Repeated(default(T), count);
    }

    public static List<T> Repeated<T>(T value, int count)
    {
        List<T> ret = new List<T>(count);
        ret.AddRange(Enumerable.Repeat(value, count));
        return ret;
    }
}

당신은 할 수 사용 Enumerable.Repeat(default(T), count).ToList()하지만 크기 조정 버퍼하는 비효율적으로 인한 것입니다.

경우 참고 T참조 형식은, 그것은 저장합니다 count에 대한 통과 기준의 사본 value그들은 모두 같은 객체를 참조 할 수 있도록 – 매개 변수를. 사용 사례에 따라 원하는 것일 수도 있고 아닐 수도 있습니다.

편집 : 주석에서 언급했듯이 Repeated원하는 경우 루프를 사용하여 목록을 채울 수 있습니다. 그것도 약간 더 빠를 것입니다. 개인적으로 Repeat더 설명적인 코드를 사용 하고 있으며 실제 환경에서는 성능 차이가 무관하다고 생각하지만 마일리지는 다를 수 있습니다.


답변

List<string> L = new List<string> ( new string[10] );


답변

int ( “capacity”)를 인수로 사용하는 생성자를 사용하십시오.

List<string> = new List<string>(10);

편집 : 나는 Frederik에 동의한다는 것을 추가해야합니다. 당신은 처음에 그것을 사용하는 전체적인 추론에 반하는 방식으로 목록을 사용하고 있습니다.

EDIT2 :

편집 2 : 현재 작성중인 것은 더 큰 프레임 워크의 일부로 기본 기능을 제공하는 기본 클래스입니다. 내가 제공하는 기본 기능에서 목록의 크기는 고급으로 알려져 있으므로 배열을 사용할 수 있습니다. 그러나 모든 기본 클래스에 동적으로 확장 할 수있는 기회를 제공하고 싶으므로 목록을 선택합니다.

모든 null 값이있는 List의 크기를 알아야하는 이유는 무엇입니까? 목록에 실제 값이 없으면 길이가 0이 될 것으로 예상합니다. 어쨌든 이것이 어색하다는 사실은 그것이 클래스의 의도 된 용도에 위배된다는 것을 보여줍니다.


답변

먼저 원하는 항목 수로 배열을 만든 다음 배열을 List로 변환합니다.

int[] fakeArray = new int[10];

List<int> list = fakeArray.ToList();


답변

고정 값으로 초기화하려면 왜 List를 사용합니까? 성능을 위해 초기 용량을 제공하고 싶지만 필요할 때 확장 할 수있는 일반 어레이에 비해 목록의 장점 중 하나가 아님을 이해할 수 있습니다.

이렇게하면 :

List<int> = new List<int>(100);

용량이 100 개의 정수인 목록을 만듭니다. 즉, 101 번째 항목을 추가 할 때까지 목록이 ‘성장’할 필요가 없습니다. 목록의 기본 배열은 길이 100으로 초기화됩니다.


답변

이와 같이 목록의 내용을 초기화하는 것은 목록의 용도가 아닙니다. 목록은 개체를 보관하도록 설계되었습니다. 특정 숫자를 특정 개체에 매핑하려면 목록 대신 해시 테이블이나 사전과 같은 키-값 쌍 구조를 사용하는 것이 좋습니다.


답변

데이터와 위치 연관이 필요하다는 점을 강조하는 것 같습니다. 연관 배열이 더 적합하지 않습니까?

Dictionary<int, string> foo = new Dictionary<int, string>();
foo[2] = "string";