[.net] 배열 대 List <T> : 언제 사용해야합니까?

MyClass[] array;
List<MyClass> list;

하나가 다른 것보다 선호되는 시나리오는 무엇입니까? 그리고 왜?



답변

실제로 배열을 사용하려는 경우는 거의 없습니다. List<T>어레이 크기 조정은 비용이 많이 들기 때문에 언제든지 데이터를 추가 / 제거 할 때 사용 하십시오. 데이터 길이가 고정되어 있다는 것을 알고 벤치마킹 후 매우 특정한 이유로 미세 최적화하려는 경우 배열이 유용 할 수 있습니다.

List<T>LINQ는 배열보다 훨씬 더 많은 기능을 제공 하지만 거의 항상 올바른 선택입니다. params물론 논쟁을 제외하고 . ;-피

카운터로서 List<T>-1 차원입니다. 어디에 당신이 int[,]or 와 같은 직사각형 (등) 배열을 가지고 string[,,]있지만 객체 모델에서 그러한 데이터를 모델링하는 다른 방법이 있습니다 (필요한 경우).

또한보십시오:

즉, protobuf-net 프로젝트 에서 배열을 많이 사용합니다 . 전적으로 성능을 위해 :

  • 그것은 많은 비트 시프 팅을 수행하므로 byte[]인코딩에는 매우 필수적입니다.
  • byte[]기본 스트림 (및 vv)으로 보내기 전에 채우는 로컬 롤링 버퍼를 사용합니다 . BufferedStream등 보다 빠릅니다 .
  • 크기는 일단 빌드되면 고정되고 매우 빠르 므로 내부적으로 배열 기반 객체 모델 () Foo[]대신 List<Foo>을 사용합니다.

그러나 이것은 분명히 예외입니다. 일반적인 업무 처리 과정에서는 List<T>매번 승리합니다.


답변

실제로 놀랍게도 링크를 추가하라는 대답은 아직 언급되지 않았습니다 . “어딘가 해로운 것으로 간주되는 배열” 에 대한 Eric의 Lippert 블로그 항목 .

실용적인 곳에서는 컬렉션을 사용하는 것이 좋다고 제목에서 판단 할 수 있지만 Marc가 올바르게 지적한 것처럼 배열이 실제로 유일한 솔루션 인 곳이 많이 있습니다.


답변

권장하는 다른 답변에도 불구하고 List<T>처리 할 때 배열을 사용하려고합니다.

  • 이미지 비트 맵 데이터
  • 다른 저수준 데이터 구조 (예 : 네트워크 프로토콜)

답변

실제로 성능에 관심이 없다면 “C ++ 대신 .Net을 사용하는 이유는 무엇입니까?”라는 의미입니다. List <>를 고수해야합니다. 유지 관리가 쉽고 배열 뒤에서 배열 크기를 조정하는 모든 더러운 작업을 수행합니다. (필요한 경우 List <>는 배열 크기를 선택하는 데 매우 현명하므로 일반적으로 필요하지 않습니다.)


답변

컬렉션 자체의 불변성이 클라이언트 및 공급자 코드 사이의 계약의 일부인 경우 (컬렉션 내의 항목의 불변성이 아닐 수 있음) IEnumerable이 적합하지 않은 경우에는 배열 을 우선적으로 사용해야 합니다.

예를 들어

var str = "This is a string";
var strChars = str.ToCharArray();  // returns array

“strChars”의 수정은 “str”의 기본 유형에 대한 구현 수준의 지식에 관계없이 원래의 “str”객체를 변경하지 않습니다.

하지만

var str = "This is a string";
var strChars = str.ToCharList();  // returns List<char>
strChars.Insert(0, 'X');

이 경우 insert 메소드가 원래 “str”오브젝트를 변경하거나 변경하지 않는 경우 해당 코드 스 니펫만으로는 명확하지 않습니다. 그러한 결정을 내리려면 String에 대한 구현 수준의 지식이 필요하며, 이는 Design by Contract 접근 방식을 위반합니다. String의 경우 큰 문제는 아니지만 거의 모든 경우에 큰 문제가 될 수 있습니다. List를 읽기 전용으로 설정하면 도움이되지만 컴파일 타임이 아닌 런타임 오류가 발생합니다.


답변

내가 필요 해요 정확히 얼마나 많은 요소를 알고있는 경우에, 나는 5 개 요소 만 필요하다고 이제까지 나는 배열을 사용하여 5 요소. 그렇지 않으면 List <T>를 사용합니다.


답변

대부분의 경우를 사용하면 List충분합니다. A List는 내부 배열을 사용하여 데이터를 처리하고 List현재 용량보다 많은 요소를 추가 할 때 배열의 크기를 자동으로 조정 하므로 용량을 미리 알아야하는 배열보다 사용하기가 더 쉽습니다.

C #의 목록에 대한 자세한 내용 또는 디 컴파일에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 를 참조 하십시오System.Collections.Generic.List<T> .

다차원 데이터가 필요한 경우 (예 : 매트릭스 또는 그래픽 프로그래밍) array대신에 사용할 수 있습니다.

항상 그렇듯이 메모리 나 성능에 문제가 있다면 측정하십시오! 그렇지 않으면 코드에 대해 잘못된 가정을 할 수 있습니다.