programing

어레이와 리스트: 언제 사용할까요?

bestprogram 2023. 4. 22. 10:59

어레이와 리스트: 언제 사용할까요?

MyClass[] array;
List<MyClass> list;

한쪽이 다른 쪽보다 더 나은 경우 어떤 시나리오가 있습니까?그리고 왜?

실제로 어레이를 사용하는 경우는 거의 없습니다. List<T>어레이의 사이징은 비용이 많이 들기 때문에 데이터를 추가/삭제하고 싶을 때 언제든지 실행할 수 있습니다.데이터가 고정 길이임을 알고 있고 매우 특별한 이유(벤치밍 후)에 따라 미세 최적화를 하려는 경우 배열을 사용하는 것이 유용할 수 있습니다.

List<T>는 어레이보다 훨씬 더 많은 기능을 제공합니다(LINQ에 의해 약간 향상되지만).대부분은 적절한 선택입니다.제외params-p;-p

로서 - 운터로로 - -List<T>서 1차원, 1차원, 1차원 등 .int[,] ★★★★★★★★★★★★★★★★★」string[,,]- 그러나 (필요한 경우) 객체 모델에서 이러한 데이터를 모델링하는 다른 방법이 있습니다.

다음 항목도 참조하십시오.

즉, protobuf-net 프로젝트에서 어레이를 많이 사용하고 있습니다.완전히 퍼포먼스를 위해서입니다.

  • 비트가 에, 「」는 「」로 합니다.byte[]부호화에 있어서 매우 중요합니다.
  • 는 로컬 롤링을 합니다.byte[] v로, "v.v."보다 .이치노BufferedStreametc
  • 으로는 오브젝트(배열 기반 모델)을 합니다.Foo[]List<Foo>사이즈는 일단 구축되면 고정되기 때문에 매우 빨라야 합니다.

, 이것은 인 LOB(Line-of-Business 에서는 ,, 것, 것입니 but but but but but 。【LOB】List<T>번번이이이이이

정말 놀라운 것은 링크를 추가하려고 대답하는 것뿐입니다.Eric's Lippert가 블로그에 올린 "Arrays는 다소 해롭다고 생각됩니다"라는 글은 아직 언급되지 않았습니다.

제목으로 판단하셔도 됩니다.실용적인 장소에서 컬렉션을 사용할 것을 제안하고 있습니다.하지만 Marc가 올바르게 지적한 것처럼 어레이가 유일한 실용적인 해결책인 곳은 많이 있습니다.

권장되는 다른 답변에도 불구하고List<T> 이렇게 배열로 , 하다, 하다, 하다, 하다, 하다, 하다, 하다.

  • 이미지 비트맵 데이터
  • 기타 저수준 데이터 구조(즉, 네트워크 프로토콜)

퍼포먼스에 정말 관심이 없는 한, 즉 "왜 사용합니까?C++가 아닌 Net?리스트를 계속 사용할 필요가 있습니다.< >유지보수가 용이하고 어레이의 크기를 조정하는 번거로운 작업이 모두 백그라운드에서 이루어집니다.(필요에 따라 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');

이 경우 삽입 메서드가 원래 "str" 개체를 변환할지 여부를 코드 스니펫만으로는 알 수 없습니다.이 결정을 내리려면 String에 대한 구현 수준의 지식이 필요합니다.이것은 계약에 의한 설계 접근법에 위배됩니다.String의 경우, 큰 문제는 아니지만, 거의 모든 경우에 큰 문제가 될 수 있습니다.목록을 읽기 전용으로 설정하면 도움이 되지만 컴파일 시간이 아닌 런타임 오류가 발생합니다.

필요한 요소가 정확히 몇 개인지 알 수 있는 경우, 예를 들어 5개의 요소가 필요하고 5개의 요소만 있으면 어레이를 사용합니다.그 이외의 경우는, 리스트만을 사용합니다.T > 。

어레이와목록은 전형적인 유지보수성과 성능의 문제입니다.거의 모든 개발자가 알고 있는 경험의 법칙은 두 가지 모두를 위해 작업해야 하지만 충돌이 발생할 경우 성능보다는 유지보수를 선택해야 한다는 것입니다.이 규칙의 예외는 퍼포먼스가 이미 문제가 되고 있는 것으로 판명된 경우입니다.이 원칙을 어레이와 어레이에 적용했을 경우리스트는 다음과 같습니다.

성능 문제가 발생할 때까지 강력한 유형의 목록을 사용하십시오.퍼포먼스에 문제가 생겼을 경우 어레이를 중단하는 것이 유지보수의 관점에서 솔루션에 미치는 영향보다 퍼포먼스로 인한 이점이 더 큰지 여부를 판단합니다.

의 경우, 「」를 하고 있습니다.ListA A A.List또, 「배열」에 하면, 의 사이즈가 으로 조정됩니다.List현재 용량보다 더 사용하기 쉽기 때문에 용량을 미리 용량을 알아야 합니다.

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

데이터가 '다차원 데이터'를 할 수 .array★★★★★★ 。

메모리나 퍼포먼스가 문제가 되는 경우는, 항상 측정해 주세요.그렇지 않으면 코드에 대해 잘못된 추측을 하고 있을 수 있습니다.

아직 언급되지 않은 또 다른 상황은 각 항목이 서로 연관되어 있지만 독립적인 고정된 변수 묶음으로 구성되는 다수의 항목을 보유하는 경우이다(예: 점의 좌표 또는 3D 삼각형의 정점).노출된 필드 구조의 배열은 요소를 "적소에" 효율적으로 수정할 수 있도록 합니다. 다른 수집 유형에서는 불가능한 것입니다.구조의 배열은 요소를 RAM에 연속적으로 보관하기 때문에 배열 요소에 대한 순차적 액세스가 매우 빠를 수 있습니다.코드가 어레이를 여러 차례 통과해야 하는 상황에서는 구조 배열이 배열 또는 클래스 오브젝트 참조의 다른 컬렉션보다 2:1의 비율로 더 높은 성능을 발휘할 수 있습니다.또한 요소를 갱신하는 기능을 통해 구조 배열이 다른 종류의 구조 집합을 능가할 수 있습니다.

어레이의 크기를 조정할 수 없지만 사용 중인 요소의 수와 함께 어레이 참조를 코드 저장하여 필요에 따라 어레이를 더 큰 것으로 교체하는 것은 어렵지 않습니다., 보다, 보다, 보다, 보다, 보다, 보다, 보다, 보다, 보다, 보다, 보다, 보다, 라고 하는 할 수 .List<T> 백업스토어가에, 쪽인가 하면, 「어느쪽인가」라고 수 .MyPoints.Add(nextPoint); ★★★★★★★★★★★★★★★★★」MyPoints.Items[23].X += 5;, 그 으로는 「」, 「」, 「」와 매우 .List<T>.

타입의 보다는 '둘다하고 있기 해야 할 하지 않을 이다.'라고하는 이 가장 인 답변이라고 생각합니다.「이러한 차이는, 특히 양쪽 모두 실장하고 있기 때문에, 달성해야 할 것에 그다지 중요하지 않을 것입니다.IEnumerable, 「 」, 「 」, 「 」를 List가 없을 까지, 그 입니다.List " ."

대부분의 경우 관리 코드에서는 마이크로 최적화에 대한 우려보다 컬렉션이 가능한 한 사용하기 쉬운 것을 선호하게 됩니다.

에 나타냅니다.NET은 어레이 위의 래퍼이며 어레이를 내부적으로 사용합니다.리스트 조작의 복잡성은 어레이와 동일하지만, 리스트의 기능이나 사용하기 쉬운 기능(자동 크기 조정이나 리스트 클래스에 부속되는 메서드 등)이 모두 추가되어 오버헤드가 조금 더 커집니다.매우 최적화된 코드를 작성해야 하거나 어레이를 중심으로 구축된 다른 코드를 사용하는 경우 등 특별한 이유가 없는 한 목록을 사용하는 것이 좋습니다.

아무도 언급하지 않았기 때문에:C#에서는 어레이는 리스트입니다.또, 양쪽 모두 를 실장하고 있습니다(예:void Foo(IList<int> foo)라고 할 수 Foo(new[] { 1, 2, 3 }) ★★★★★★★★★★★★★★★★★」Foo(new List<int> { 1, 2, 3 }))

그래서, 당신이 받아들인다면List<MyClass>의 서브셋만 합니다.「 」 、 「 」 、 「 」 、 「 」라고 선언할 수 있습니다.IList<MyClass>발신자의 편의를 위해

세부사항:

그들은 인기가 없을지도 모르지만 게임 프로젝트 프로젝트의 팬 어레이 팬입니다 - 반복 속도는 너무 느려지지 않는 경우, 어레이에 더 느린 오버헤드를 제거할 수 있습니다.하지만, 가장 중요한 경우, 더 많은 메모리가 부족하면 추가 메모리 및 포인터 및 포인터 및 포인터를 추적하고 포인터 및 포인터를 추적하고 포인터를 추적합니다.

그 말은, 저는 어레이보다 훨씬 자주 사용하지만, 그들은 그들의 장소들을 가지고 있습니다.

래퍼와 열거 오버헤드를 최적화할 수 있도록 내장된 유형을 나열하는 것이 좋습니다.

목록을 입력하는 것은 배열보다 쉽습니다.배열의 경우 데이터의 정확한 길이를 알아야 하지만 목록의 경우 데이터 크기는 임의입니다.목록을 배열로 변환할 수 있습니다.

List<URLDTO> urls = new List<URLDTO>();

urls.Add(new URLDTO() {
    key = "wiki",
    url = "https://...",
});

urls.Add(new URLDTO()
{
    key = "url",
    url = "http://...",
});

urls.Add(new URLDTO()
{
    key = "dir",
    url = "https://...",
});

// convert a list into an array: URLDTO[]
return urls.ToArray();

List에서는 이 작업을 수행할 수 없습니다.

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

arr.Add("string a");
arr.Add("string b");
arr.Add("string c");
arr.Add("string d");

arr[10] = "new string";

예외가 생성됩니다.

어레이 대신:

string[] strArr = new string[20];

strArr[0] = "string a";
strArr[1] = "string b";
strArr[2] = "string c";
strArr[3] = "string d";

strArr[10] = "new string";

그러나 어레이에서는 자동 데이터 구조 크기가 조정되지 않습니다.수동으로 관리하거나 어레이를 사용하여 관리해야 합니다.크기 조정 방법.

트릭은 빈 배열로 목록을 초기화할 수 있습니다.

List<string> arr = new List<string>(new string[100]);

arr[10] = "new string";

그러나 이 경우 Add 메서드를 사용하여 새 요소를 삽입하면 목록 끝에 해당 요소가 삽입됩니다.

List<string> arr = new List<string>(new string[100]);

arr[10] = "new string";

arr.Add("bla bla bla"); // this will be in the end of List

데이터 구조가 필요한 컨텍스트에 따라 완전히 달라집니다.예를 들어, 다른 기능이나 서비스에서 사용할 항목을 작성하는 경우 List를 사용하는 것이 가장 적합한 방법입니다.

항목 목록이 있고 항목만 표시하려는 경우 웹 페이지에서 어레이를 사용해야 하는 컨테이너가 있다고 가정합니다.

언급URL : https://stackoverflow.com/questions/434761/array-versus-listt-when-to-use-which