C#의 컬렉션
컬렉션은 .NET FCL(프레임워크 클래스 라이브러리)의 중요한 부분이며 개발 과정에서 가장 일반적으로 사용되는 기능 중 하나입니다. IEnumerable, IEnumerator 및 ICollection을 보면 그것이 무엇인지, 왜 그런지 알 수 있습니다. List와 Dictionary 외에 어떤 다른 컬렉션 클래스를 사용해 보셨나요? 더 이상 고민하지 않고 오늘은 컬렉션 클래스와 그 구현을 정의하는 일부 인터페이스를 살펴보겠습니다.
먼저 FCL이 제공하는 인터페이스를 살펴보겠습니다.
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
IEnumerator는 컬렉션의 각 요소에 대한 단방향 정방향 액세스를 달성할 수 있도록 컬렉션을 탐색하는 기본 방법을 정의합니다. IEnumerable에는 순회자인 GetEnumerator라는 메서드가 하나만 있습니다.
아아아아참고: 우리가 자주 사용하는 foreach는 일종의 구문 설탕으로 실제로 Enumerator에서 Current 및 MoveNext에 의해 구현된 순회 함수를 호출합니다.
아아아아위 코드에 사용된 foreach 및 열거자는 결국 IL에서 열거자의 MoveNext 및 Current로 변환됩니다.
IEnumerable은 매우 유용한 인터페이스입니다.
foreach 문 지원
표준 소장수업으로 타 도서관과 교류
더욱 복잡한 컬렉션 인터페이스의 요구 사항 충족
컬렉션 초기화 지원
물론 이를 달성하는 방법은 다음과 같이 다양합니다.
컬렉션이 다른 컬렉션 클래스를 캡슐화하여 제공되는 경우 이 컬렉션의 열거자를 직접 반환할 수 있습니다
수익률 반환을 사용하여 반환
을 구현하기 위해 자체 IEnumerator를 구현합니다. 여기에서는 Yield를 통해 열거자
public interface IEnumerable { IEnumerator GetEnumerator(); }
상단의 첫 번째 그림을 보면 ICollection이 IEnumerable에서 직접 상속되었음을 알 수 있습니다. 실제로 이는 ICollection이 IEnumerable보다 더 많은 기능을 지원한다고 말할 수 있습니다.
집합과 요소의 개수 세기
요소의 첨자를 가져옵니다.
인지 확인 끝에 요소 추가
요소 등을 제거합니다. . .
ICollection은 ICollection
IList는 ICollection 및 IEnumerable에서 직접 상속됩니다. 따라서 두 가지 기능을 모두 포함하고 아래 첨자를 기반으로 요소에 액세스하고 추가하는 것을 지원합니다. IndexOf, Insert, RemoveAt 등. IEnumerable은 최소한의 기능만 지원하고 순회만 지원한다고 말할 수 있습니다. ICollection은 순회뿐만 아니라 컬렉션 유지를 포함하여 약간 더 많은 기능을 지원합니다. 그리고 IList는 가장 완전한 버전입니다.
이는 Framework 4.5의 새로운 인터페이스 유형으로, 이 컬렉션을 변경할 수 있는 모든 기능을 제거한 IList8742468051c85b06f0a0af9e3e506b5c의 단축 버전으로 간주될 수 있습니다. 예: Add, RemoveAt 등
IDictionary는 키-값 쌍 컬렉션에 대한 액세스를 제공하며 ICollection
연관 컬렉션 클래스는 우리가 흔히 키-값 쌍 컬렉션이라고 부르는 클래스로, Key를 통해 컬렉션에 액세스하고 유지 관리할 수 있습니다. 먼저 FCL이 제공하는 일반 연관 컬렉션 클래스가 무엇인지 살펴보겠습니다.
사전
SortedDictionary8c189faf63255a5ea96468ba21dd0564
SortedList8c189faf63255a5ea96468ba21dd0564
Dictionary
Dictionary8c189faf63255a5ea96468ba21dd0564검색과 삽입이 빠른 것이 장점인데, 단점은 무엇인가요? Hashtable을 저장 구조로 사용하기 때문에 내부의 데이터가 순서 없이 배열되어 있다는 의미이므로 Dictionary
TKey 형식은 GetHashCode() 및 Equals() 를 구현하거나 IEqualityComparer를 제공해야 합니다. 그렇지 않으면 가 작동합니다. 문제가 발생할 수 있습니다.
SortedDictionary
비연관적 일반 컬렉션 클래스
또한 내부 본질이 배열이기 때문에 List에 데이터를 추가하는 것이 더 빠르지 않을 수 있지만, 데이터의 선두나 중간에 데이터를 추가하거나 삭제하는 것은 다른 데이터의 재배열에 영향을 미치기 때문에 상대적으로 효율성이 떨어집니다.
링크드리스트8742468051c85b06f0a0af9e3e506b5c
해시세트8742468051c85b06f0a0af9e3e506b5c
HashSet은 아래 첨자 액세스를 지원하지 않습니다.
SortedSet8742468051c85b06f0a0af9e3e506b5c
스택8742468051c85b06f0a0af9e3e506b5c
선입선출 대기열
아래 첨자를 눌러
집결 |
순서대로 정리 |
연순 창고 |
직접 접근 방법 |
방문시간 |
운영시간 |
비고 |
사전 |
|
네 |
열쇠 |
키: 오(1)
|
오(1) |
가장 빠른 접속 성능과 정렬을 지원하지 않습니다 |
SortedDinctionary |
순서대로 정리 |
아니요 |
열쇠 |
키: |
O(log n) |
빠른 액세스와 정렬 지원 사이의 균형 |
정렬목록 |
순서대로 정리 |
네 |
열쇠 |
키: O(log n)
|
오(n) |
데이터가 저장 구조로 트리 대신 내부적으로 사용된다는 점을 제외하면 SortedDictionary와 유사합니다. |
목록 |
사용자는 요소의 위치를 정밀하게 제어할 수 있습니다 |
네 |
색인 |
색인: O(1) 값: O(n)
|
오(n) |
각 요소에 직접 액세스해야 하는 소규모 컬렉션에 가장 적합합니다. |
링크드리스트 |
사용자는 요소의 위치를 정밀하게 제어할 수 있습니다 |
아니요 |
지원되지 않음 |
값: 오(n)
|
오(1) |
개별 요소에 직접 액세스할 필요는 없지만 컬렉션에 매우 자주 추가/제거가 필요한 시나리오에 가장 적합합니다. |
해시세트 |
지원되지 않음 |
네 |
열쇠 |
키: 오(1)
|
오(1) |
요소의 고유성을 유지하는 컬렉션입니다. 정렬은 지원되지 않습니다 |
정렬세트 |
순서대로 정리 |
아니요 |
열쇠 |
키: O(log n)
|
O(log n) |
요소 고유성을 유지하고 정렬을 지원할 수 있습니다. |
스택 |
LIFO |
네 |
최상위 요소만 획득 가능 |
탑: O(1) |
오(1) |
|
대기열 |
FIFO |
네 |
하단 요소만 획득 가능 |
앞 : O(1) |
오(1) |
|
일반 컬렉션 클래스는 .NET 2.0에서 나왔습니다. 즉, .NET 1.0에는 이러한 편의성이 없었습니다. 이제 기본적으로 이전 코드와의 호환성을 유지하기 위해 일부 작업을 수행하는 경우를 제외하고는 이러한 컬렉션 클래스를 더 이상 사용하지 않습니다. 1.0 시대의 .NET 프로그래머가 어떤 컬렉션 클래스를 사용할 수 있는지 살펴보겠습니다.
배열목록
나중에 List8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.
HashTable은 나중에 Dictionary8c189faf63255a5ea96468ba21dd0564로 대체되었습니다.
Queue 는 나중에 Queue
SortedList는 나중에 SortedList8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.
스택은 나중에 Stack8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.
ConcurrentQueue 스레드로부터 안전한 Queue
ConcurrentStack 스택의 스레드 안전 버전
ConcurrentBag 스레드로부터 안전한 객체 컬렉션
ConcurrentDictionary 스레드로부터 안전한 사전
BlockingCollection
.NET에서 제공하는 컬렉션 클래스는 가장 일반적으로 사용되는 도구 클래스 중 하나입니다. 이 문서가 모든 사람이 이러한 컬렉션 클래스를 더 잘 이해하는 데 도움이 되기를 바랍니다. 물론 개인적으로 아직 불완전한 부분이 있다고 생각합니다. 예를 들어 HashTable과 Binary Search Tree는 자세히 연구되지 않았으며, 단방향 연결 목록과 이중 연결 목록의 비교는 이 기사에서 언급되지 않았습니다. 관심 있는 친구들은 이에 대해 더 자세히 알아볼 수 있습니다.
위 내용은 C# 컬렉션 유형의 그래픽 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!