List <T>는 항목이 추가 된 순서대로 반환되도록 보장합니까?


81

List<T>항목이 열거 될 때 추가 된 순서대로 반환된다는 것을 항상 보장 합니까 ?

업데이트 됨 : 모든 답변에 감사드립니다. List<T>.NET Reflector를 사용하여클래스를빠르게 살펴 봤고(아마도 처음에이를 수행했을 것입니다) 실제로 기본 저장소는T(T[])의 배열입니다.


20
실험과 리버스 엔지니어링을 통해 현재 형식의 List <T>가 실제로 순서를 유지한다는 것을 확인했지만 Microsoft가이를 공식화하고 문서에이 보증을 적용하면 좋을 것입니다. 이 글을 읽는 사람이 거기에 영향력이 있습니까?
IJ Kennedy

2
@IJKennedy 에핀 A! 그리고 그것은 더 많은 MS 문서에 적용됩니다. 당신에게 +1. (가능한 경우 +100). MS에서 몇 마디가 부족하기 때문에 수천 또는 수백만의 MS 개발자가 리버스 엔지니어링, 테스트 등에 시간을 소비합니다. 그들은 이것을 깨닫지 못합니까? 세월이 흘러도 아무것도 변하지 않습니다.
Jason S

답변:


68

목록은 색인 기반이며 새 항목은 항상 목록 끝에 추가됩니다. 다음 항목이 한 위치로 이동하도록 특정 색인에 항목을 삽입 할 수 있습니다.

그래서 , 그렇게 안전하게 사용할 수 있습니다 .

List (T) 클래스는 ArrayList 클래스에 해당하는 일반적인 클래스입니다. 필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList (T) 제네릭 인터페이스를 구현합니다.

이 컬렉션의 요소는 정수 인덱스를 사용하여 액세스 할 수 있습니다. 이 컬렉션의 인덱스는 0부터 시작합니다.

List (T)는 정렬이 보장되지 않습니다. List (T)를 정렬해야하는 작업 (예 : BinarySearch)을 수행하기 전에 List (T)를 정렬해야합니다.

컬렉션이 수정되지 않는 한 List (T)는 동시에 여러 판독기를 지원할 수 있습니다. 컬렉션을 통한 열거는 본질적으로 스레드로부터 안전한 프로 시저가 아닙니다. 드물게 열거가 하나 이상의 쓰기 액세스와 충돌하는 경우 스레드 안전성을 보장하는 유일한 방법은 전체 열거 동안 컬렉션을 잠그는 것입니다. 읽기 및 쓰기를 위해 여러 스레드에서 컬렉션에 액세스 할 수 있도록하려면 고유 한 동기화를 구현해야합니다.

MSDN 에서 자세한 내용을 읽을 수 있습니다 .


1
List <T>의 문서에는 검색 순서가 삽입 순서와 동일하다고 명시되어 있지 않은 것 같습니다. 현재로서는 그렇게 작동하지만 그렇게하는 것으로 문서화되어 있지 않습니다.
Cheeso 2009-06-25

그것은 참으로 옳습니다. 항상 그것에 대해 의식하는 것이 좋습니다. 그리고 그것이 절대적으로 중요 할 때는 그것에 의지하지 않는 것이 좋습니다!
Sander Versluys

@Cheeso 검색 순서를 보장합니다. 이 세부 사항을 포함하는 답변을 추가했습니다.
Alex Angas 2014 년

안녕. 인라인 초기화와 동작이 동일한 지 알고 있습니까?
Gioce90

9

예, 삽입 순서와 검색 순서를 모두List<T> 보장 하며 이는 MSDN에 문서화되어 있습니다 (아래 강조는 내 것임).

삽입

List<T>.Add 방법

끝에List<T> 개체를 추가합니다 .

항목 매개 변수는 다음과 같습니다.

끝에List<T> 추가 할 개체 입니다.

List<T>.AddRange 방법

받는 지정된 컬렉션의 요소에 추가 의 끝을List<T> .

컬렉션 매개 변수는 다음과 같습니다.

.NET Framework의 끝에List<T> 요소를 추가해야하는 컬렉션입니다 .

검색

List<T>.Enumerator 구조

처음에 열거자는 컬렉션의 첫 번째 요소 앞에 배치됩니다. 이 위치에서 Current정의되지 않습니다. 따라서 의 값을 읽기 전에 MoveNext열거자를 컬렉션첫 번째 요소로 이동 하도록 호출해야합니다 Current.

CurrentMoveNext호출 될 때까지 동일한 객체를 반환합니다 . 다음 요소로MoveNext 설정 Current합니다 .


3
알렉스, 당신이 타당하지 않은 결론에 도달했을 수도 있습니다. "컬렉션의 첫 번째 요소"가 "컬렉션에 추가 된 첫 번째 요소"와 반드시 동일하지는 않습니다. "마지막 요소"도 마찬가지입니다. 문서는 검색 순서가 삽입 순서와 관련되어 있다고 언급하지 않았습니다.
Cheeso

그냥 궁금해하고, does AddRange()전달 된 요소의 순서를 유지하거나 내부 배열에 추가하는 순서로 자유롭게 이동할 수 있습니까? (분명히 그들은 모두 현재 목록의 끝에있을 것입니다)
Ryan Buddicom

Alex가 맞습니다. Microsoft의 Add 메서드는 특히 목록의 순서 (이 경우 끝)를 참조합니다. Insert 메서드 ( '지정된 인덱스')도 마찬가지입니다.
Chalky

Lists <>에 배열 인덱서와 Insert () 메서드 (인덱스 사용)가 있음을 확인하자마자 순서를 지정해야합니다. 이 두 기능을 모두 사용하려면이 경우가 필요합니다. 이러한 메서드는 나중에 이동하지 않는 한 이러한 값을 지정된 위치에서 사용할 수 있다는 클래스의 최종 사용자와 계약을 맺습니다.
krowe2

문서가 업데이트 된 것 같습니까? 이제 AddRange 설명에 추가되었습니다. l docs.microsoft.com/en-us/dotnet/api/… > 컬렉션의 요소 순서는 List <T>에 유지됩니다.
Depechie


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.