2013-11-20 8 views
10

디버거에서 단일 항목으로 채워진 목록을 보면 해당 요소의 _items 필드에 4 개의 요소가 포함되어 있습니다. 그 행동을 설명해 주시겠습니까?목록은 정확히 하나의 요소로 채워져 있어도 디버거에서 4 개의 항목을 표시합니다.

내 콘솔 응용 프로그램을 디버깅하는 동안 DistinctToList에 대해 알게되어 혼란 스럽습니다. 코드 : (6, 0, 0, 0) 분명히 잘못된 것입니다 :

List<int> nums = new List<int>() { 6, 6, 6, 6, 6, 6, 6, 6 }; 
List<int> distinctNums = nums.Distinct().ToList(); 
int[] distinctNums2 = nums.Distinct().ToArray(); 
  • distinctNums_items 4 개 요소가 있습니다.
  • distinctNums2의 항목은 (6)이며 올바른 내용입니다.
+2

둘 다 목록의 단일 요소를 반환합니다. 어떻게 결과를 확인하고 있습니까? – Habib

+1

디버거의 참여를 반영하여 게시물을 크게 업데이트했습니다. 마음에 들지 않으면 편집하십시오. –

답변

12

예상 한대로 하나의 항목 만 포함하는 distinctNums 목록이 생성됩니다. 그러나 .NET의 목록에는 항목을 추가 할 때 자동으로 크기가 조정되는 배열이 지원됩니다. 이 배열은 크기가 4부터 시작하기 때문에 내부 배열은 반사 또는 디버거를 통해 조사 할 경우 [4, 0, 0, 0]이됩니다.

하지만 확인하면 distinctNums.Count == 1입니다. CountCapacity 속성을 비교하십시오.

+1

+1 내부 멋진 고장! –

+0

는 OP를 사용하여 '용량'항목 수를 확인하는 것처럼 보입니까? 너무 끔찍해. –

+1

+1 @ KingKing - 더 많은 가능성있는 OP가 첫 번째 실제 필드를 볼 때까지 단순히 "+"를 클릭했습니다. 디버깅하는 동안 VS 편집기에서 목록을보고 "Raw view"를 클릭하십시오.) –

3

distinctNumsdistinctNums2은 실제로 하나의 개체 만 포함합니다.

디버거에서 표시되는 네 개의 항목이있는 목록은 List<int>을 백업하는 배열 일뿐입니다. Count1이고 목록을 반복하면 6이라는 단일 문자 만 반환한다는 것을 알 수 있습니다.

1

List<T>T[] (표준 배열)의 맨 위에있는 추상화입니다. 배열의 크기는 중요하지 않습니다. 컴파일러가 new T[1]을 할당하지 않은 하나의 항목으로 List<T>을 할당하면 확장 할 공간이 생깁니다 (상대적으로 비싼 작업 인 원래의 배열을 초과 할 때 새 배열과 항목을 다시 할당해야합니다). Count은 길이 목록을 제공하고 해당 목록에서 호출하면 1을 얻습니다. 다른 세 개의 색인은 기본값이 0이고 목록의 일부가 아니며 기본 배열의 일부입니다. 그것들은 관련이 없습니다. myList[3]을 시도한 경우에도 여전히 예외가 발생하지만 그 값은 0이 아닙니다.

두 경우 모두 Distinct이 반환되며 IEnumberable<int>은 하나의 항목으로 반환됩니다. ToList을 호출하면 새 목록이 할당되고 개수는 1, 기본 데이터 구조는 시작 길이가 4 인 int[]입니다. 추가 한 항목이 많으면 증가합니다. 두 번째 예제에서는 ToArray을 호출하여 int[1]을 새로 할당하고 그에 대한 참조를 반환합니다.