2012-12-06 6 views
8

확장 방법 ToList()은 어떻게 작동합니까? IEnumerable10000 개가 있다고 가정 해 보겠습니다. ToList()을 새로 작성하고 List을 만들고 IEnumerable10000 개를 반복 한 다음 List을 반환하거나 .NET을 다른 방법으로 사용합니까?IEnumerable에서 ToList()는 어떻게 작동합니까?

MSDN link은 DB 쿼리의 즉각적인 실행에 대해 이야기합니다. 제 질문은 IEnumerableList으로 변환하는 것입니다.

답변

22

"최악의 경우"이지만 반드시 반복하지 않아도됩니다. 기본적으로 new List<T>(source)이 호출되지만 슬리브의 일부 트릭이 있습니다. 소스가 ICollection<T>을 구현하는 경우 생성자는 ICollection<T>.CopyTo()을 호출하여 전체 데이터를 배열에 복사 할 수 있습니다. 이것은 단일 스테핑 반복보다 효율적으로 구현 될 수 있습니다. 마찬가지로 ICollection<T> 경우 새 목록은 최종 크기를 알고 있으므로 내부 버퍼를 계속 확장 할 필요가 없습니다.

몇 가지 자세한 내용은 내 Edulinq ToList() blog post을 참조하십시오.

+0

위의 링크는 작동하지 않습니다. 여기에서 Jon의 게시물로 이동할 수 있습니다 - [Edulinq ToList() 블로그 게시물] (https://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-20-tolist/) – vibhu

+0

@ vibhu : 링크를 업데이트했습니다. –

2

.ToList 확장 메서드는 List<T> 생성자를 호출하여 IEnumerable<T>을 전달합니다. 이 생성자는 IEnumerable<T>을 반복하고 IEnumerable<T>의 elemtns를 반환되는 순서와 동일한 순서로 복사합니다.

관련 문제