List<T>
은 내부 배열을 사용합니다. 내부 배열의 전체 내용을 한 방향으로 이동해야하기 때문에 목록 시작 부분 근처에서 항목을 제거/삽입하는 것은 목록 끝 부분에서 동일한 작업을 수행하는 것보다 비용이 많이 듭니다. 또한 내부 목록이 가득 차면 항목을 추가하려고하면 더 큰 새 배열이 만들어지고 내용이 복사되고 이전 배열은 삭제됩니다.
클래스는 매개 변수없는 생성자와 함께 사용되는 경우 List<T>
을 내부적으로 사용합니다. 따라서 랩핑으로 인한 오버 헤드를 제외하고는 성능 측면에서 동일합니다. (본질적으로 다른 레벨의 간접 참조는 대부분의 시나리오에서 무시할 수 있습니다.)
LinkedList<T>
은 링크 된 목록입니다. 이것은 삽입/제거 속도를 위해 반복 속도를 희생합니다. 반복은 포인터에서 포인터로의 포인터를 무한히 횡단하는 것을 의미하므로 전체적으로 더 많은 작업이 필요합니다. 포인터 탐색과는 별도로 두 노드를 서로 가까이 배치하지 않아도 CPU RAM 캐시의 효율성을 떨어 뜨릴 수 있습니다.
그러나 노드를 삽입하거나 제거하는 데 필요한 시간은 목록의 상태에 관계없이 동일한 수의 작업이 필요하기 때문에 일정합니다. (제거 할 항목을 실제로 찾거나 삽입 지점을 찾기 위해 목록을 탐색하기 위해 수행해야하는 작업은 고려하지 않습니다.)
무언가가있는 경우 컬렉션에 대한 주된 관심사가 테스트중인 경우 컬렉션, HashSet<T>
대신 사용할 수 있습니다.세트에 항목을 추가하는 것은 목록과 링크 된 목록에 삽입하는 것 사이의 비교적 빠른 것입니다. 항목 제거는 상대적으로 빠릅니다. 그러나 실제로는 조회 시간에 있습니다. HashSet<T>
에 항목이 포함되어 있으면 전체 목록을 반복 할 필요가 없습니다. 평균적으로 모든 목록 또는 연결된 목록 구조보다 빠르게 수행됩니다.
그러나 HashSet<T>
에는 동일한 항목이 포함될 수 없습니다. 귀하의 요구 사항 중 일부로 동일하다고 여겨지는 항목 (Object.Equals(Object)
오버로드 또는 IEquatable<T>
구현)이 컬렉션에 독립적으로 공존하는 경우 HashSet<T>
을 사용할 수 없습니다. 또한 HashSet<T>
은 게재 신청서를 보장하지 않으므로 어떤 종류의 주문 유지가 중요한 경우 HashSet<T>
을 사용할 수 없습니다.
당신은'Collection' 또는'Collection'을 말하고 있습니까? boxing/unboxing은 중요한 고려 사항/퍼펙트 임팩트 (일반 콜렉션으로 해결됨)이기 때문에 –
RPM1984
사용 된 내부 데이터 구조를 취할 때 Collection 또는 Collection을 고려할 수 있습니다. 예를 들어 컬렉션 을 가져 가십시오. –
RAM
BTW, C# 컬렉션 클래스가 없습니다. 이 클래스는 모두 .NET 컬렉션 클래스이며 모든 .NET 언어에서 사용할 수 있습니다. –