>  기사  >  백엔드 개발  >  C# 컬렉션 유형의 그래픽 코드에 대한 자세한 설명

C# 컬렉션 유형의 그래픽 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-09 15:23:191943검색

C#의 컬렉션

컬렉션은 .NET FCL(프레임워크 클래스 라이브러리)의 중요한 부분이며 개발 과정에서 가장 일반적으로 사용되는 기능 중 하나입니다. IEnumerable, IEnumerator 및 ICollection을 보면 그것이 무엇인지, 왜 그런지 알 수 있습니다. List와 Dictionary 외에 어떤 다른 컬렉션 클래스를 사용해 보셨나요? 더 이상 고민하지 않고 오늘은 컬렉션 클래스와 그 구현을 정의하는 일부 인터페이스를 살펴보겠습니다.

컬렉션 인터페이스

먼저 FCL이 제공하는 인터페이스를 살펴보겠습니다.

IEnumerable 및 IEnumberator

public interface IEnumerator
{
 
    bool MoveNext();
    object Current {  get; }
    void Reset();
}

IEnumerator는 컬렉션의 각 요소에 대한 단방향 정방향 액세스를 달성할 수 있도록 컬렉션을 탐색하는 기본 방법을 정의합니다. IEnumerable에는 순회자인 GetEnumerator라는 메서드가 하나만 있습니다.

아아아아

참고: 우리가 자주 사용하는 foreach는 일종의 구문 설탕으로 실제로 Enumerator에서 Current 및 MoveNext에 의해 구현된 순회 함수를 호출합니다.

아아아아

위 코드에 사용된 foreach 및 열거자는 결국 IL에서 열거자의 MoveNext 및 Current로 변환됩니다.

IEnumerable은 매우 유용한 인터페이스입니다.

  1. foreach 문 지원


  2. 표준 소장수업으로 타 도서관과 교류


  3. 더욱 복잡한 컬렉션 인터페이스의 요구 사항 충족


  4. 컬렉션 초기화 지원

물론 이를 달성하는 방법은 다음과 같이 다양합니다.

  1. 컬렉션이 다른 컬렉션 클래스를 캡슐화하여 제공되는 경우 이 컬렉션의 열거자를 직접 반환할 수 있습니다


  2. 수익률 반환을 사용하여 반환


을 구현하기 위해 자체 IEnumerator를 구현합니다. 여기에서는 Yield를 통해 열거자

public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

를 반환하는 방법을 보여 드리겠습니다. ICollection

상단의 첫 번째 그림을 보면 ICollection이 IEnumerable에서 직접 상속되었음을 알 수 있습니다. 실제로 이는 ICollection이 IEnumerable보다 더 많은 기능을 지원한다고 말할 수 있습니다.

  1. 집합과 요소의 개수 세기



  2. 요소의 첨자를 가져옵니다.


  3. 인지 확인 끝에 요소 추가


  4. 요소 등을 제거합니다. . .

ICollection은 ICollection와 약간 다릅니다. ICollection은 컬렉션 편집 기능, 즉 추가 및 제거 기능을 제공하지 않습니다. 요소가 포함되어 있는지 확인하는 것은 지원되지 않습니다.

IList

IList는 ICollection 및 IEnumerable에서 직접 상속됩니다. 따라서 두 가지 기능을 모두 포함하고 아래 첨자를 기반으로 요소에 액세스하고 추가하는 것을 지원합니다. IndexOf, Insert, RemoveAt 등. IEnumerable은 최소한의 기능만 지원하고 순회만 지원한다고 말할 수 있습니다. ICollection은 순회뿐만 아니라 컬렉션 유지를 포함하여 약간 더 많은 기능을 지원합니다. 그리고 IList는 가장 완전한 버전입니다.

IReadOnlyList8742468051c85b06f0a0af9e3e506b5c

이는 Framework 4.5의 새로운 인터페이스 유형으로, 이 컬렉션을 변경할 수 있는 모든 기능을 제거한 IList8742468051c85b06f0a0af9e3e506b5c의 단축 버전으로 간주될 수 있습니다. 예: Add, RemoveAt 등

IDictionary8c189faf63255a5ea96468ba21dd0564

IDictionary는 키-값 쌍 컬렉션에 대한 액세스를 제공하며 ICollection 및 IEnumerable을 상속하고 Key를 통해 데이터에 액세스하고 작동하는 방법을 확장합니다.

연관 일반 컬렉션 클래스

연관 컬렉션 클래스는 우리가 흔히 키-값 쌍 컬렉션이라고 부르는 클래스로, Key를 통해 컬렉션에 액세스하고 유지 관리할 수 있습니다. 먼저 FCL이 제공하는 일반 연관 컬렉션 클래스가 무엇인지 살펴보겠습니다.

  1. 사전


  2. SortedDictionary8c189faf63255a5ea96468ba21dd0564


  3. SortedList8c189faf63255a5ea96468ba21dd0564

사전

Dictionary는 아마도 가장 일반적으로 사용되는 연관 컬렉션일 것입니다. 데이터에 액세스하고 추가하고 삭제하는 데 걸리는 시간은 Hashtable을 내부적으로 저장 구조로 사용하기 때문에 모든 컬렉션 클래스 중에서 가장 빠릅니다. 얼마나 많은 키-값 쌍이 저장되어 있는지, 쿼리/추가/삭제에 걸리는 시간은 동일하며 시간 복잡도는 O(1)입니다.

Dictionary8c189faf63255a5ea96468ba21dd0564검색과 삽입이 빠른 것이 장점인데, 단점은 무엇인가요? Hashtable을 저장 구조로 사용하기 때문에 내부의 데이터가 순서 없이 배열되어 있다는 의미이므로 Dictionary에 있는 데이터를 특정 순서로 순회하려면 약간의 노력이 필요합니다.

TKey 형식은 GetHashCode()Equals() 를 구현하거나 IEqualityComparer를 제공해야 합니다. 그렇지 않으면 가 작동합니다. 문제가 발생할 수 있습니다.

SortedDictioanry8c189faf63255a5ea96468ba21dd0564

SortedDictionary와 Dictionary는 거의 유사하지만 구현에 약간의 차이가 있습니다. SortedDictionary8c189faf63255a5ea96468ba21dd0564는 이진 트리를 저장 구조로 사용합니다. 그리고 주요 순서대로 배열했습니다. 이 경우 SortedDictionary의 TKey는 IComparable를 구현해야 합니다. 빠른 쿼리를 원하고 정렬도 잘 지원하고 싶다면 SortedDictionary를 사용하세요.

SortedList8c189faf63255a5ea96468ba21dd0564                                                               SortedList8c189faf63255a5ea96468ba21dd0564는 정렬을 지원하는 또 다른 연관 컬렉션입니다. 그러나 차이점은 SortedList가 실제로 데이터를 배열에 저장한다는 것입니다. 즉, 추가 및 제거 작업은 선형이며 요소를 작업하면 모든 데이터가 이동할 수 있으므로 시간 복잡도는 O(n)입니다. 하지만 검색 시 이진 검색을 사용하므로 검색 성능이 향상되고 시간 복잡도는 O(log n)입니다. 따라서 권장되는 사용 시나리오는 다음과 같습니다. 빠르게 검색하고, 키 순서로 컬렉션을 정렬하고 싶고, 마지막 컬렉션 작업(추가 및 제거)이 상대적으로 작은 경우 SortedList입니다.

비연관적 일반 컬렉션 클래스

비연관 컬렉션은 키 작업이 필요하지 않은 컬렉션 클래스입니다. 일반적으로 요소 자체나 아래 첨자를 사용하여 작업할 수 있습니다. FCL은 주로 다음과 같은 비연관 일반 컬렉션 클래스를 제공합니다.

    목록

  1. 링크드리스트8742468051c85b06f0a0af9e3e506b5c

  2. HashSet8742468051c85b06f0a0af9e3e506b5c

  3. SortedSet8742468051c85b06f0a0af9e3e506b5c

  4. 스택8742468051c85b06f0a0af9e3e506b5c

  5. 대기열8742468051c85b06f0a0af9e3e506b5c
  6. 목록8742468051c85b06f0a0af9e3e506b5c

일반 List 클래스는 길이에 제한이 없는 컬렉션 유형을 제공합니다. List는 내부적으로 특정 길이(기본 초기 길이는 4)의 배열을 유지합니다. 삽입된 요소의 길이가 4 또는 초기 길이를 초과하면 다시 생성됩니다. -새 배열 생성, 이 새 배열의 길이는 초기 길이의 2배입니다(항상 2배는 아니지만 계속 확장되는 것으로 확인되면 배수가 더 커짐). 그런 다음 원래 배열을 복사합니다. 따라서 이 컬렉션을 사용하여 보관할 요소 수를 알면 컬렉션을 만들 때 초기 값을 지정할 수 있으므로 반복적으로 새 배열을 만들고 값을 복사하는 것을 피할 수 있습니다.

또한 내부 본질이 배열이기 때문에 List에 데이터를 추가하는 것이 더 빠르지 않을 수 있지만, 데이터의 선두나 중간에 데이터를 추가하거나 삭제하는 것은 다른 데이터의 재배열에 영향을 미치기 때문에 상대적으로 효율성이 떨어집니다.

링크드리스트8742468051c85b06f0a0af9e3e506b5c

LinkedList는 내부적으로 양방향 연결 목록을 유지하므로 LinkedList의 어느 위치에서나 데이터를 추가하거나 삭제하는 성능이 매우 빠릅니다. 다른 요소가 움직이지 않기 때문입니다. 일반적인 상황에서는 List만으로도 충분하지만, 컬렉션 중간에 추가 및 삭제 작업이 매우 빈번하다면 LinkedList를 사용하는 것이 좋습니다.

해시세트8742468051c85b06f0a0af9e3e506b5c

HashSet은 고유성을 유지할 수 있는 순서가 지정되지 않은 집합입니다. TKey와 TValue가 모두 동일한 객체를 가리키는 점을 제외하고 HashSet을 Dictionary로 생각할 수도 있습니다. HashSet은 세트의 요소를 고유하게 유지해야 하지만 순서대로 정렬할 필요는 없을 때 매우 적합합니다.

HashSet은 아래 첨자 액세스를 지원하지 않습니다.

SortedSet8742468051c85b06f0a0af9e3e506b5c

SortedSet과 HashSet은 SortedDictionary와 Dictionary와 같습니다. 둘의 차이점을 아직도 기억하시나요? SortedSet은 내부적으로 요소를 순서대로 정렬하는 데 사용되는 이진 트리이기도 합니다.

스택8742468051c85b06f0a0af9e3e506b5c

후입선출 대기열

첨자에 의한 액세스는 지원되지 않습니다

​큐

선입선출 대기열
​아래 첨자를 눌러

에 액세스하는 것을 지원하지 않습니다. 권장 사용 시나리오

집결

순서대로 정리

연순 창고

직접 접근 방법

방문시간

운영시간

비고

사전

열쇠

키:

오(1)

오(1)

가장 빠른 접속 성능과 정렬을 지원하지 않습니다

SortedDinctionary

순서대로 정리

아니요

열쇠

키:
O(log n)

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 프로그래머가 어떤 컬렉션 클래스를 사용할 수 있는지 살펴보겠습니다.

  1. 배열목록

나중에 List8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.

  1. HashTable은 나중에 Dictionary8c189faf63255a5ea96468ba21dd0564로 대체되었습니다.


  2. Queue 는 나중에 Queue로 대체되었습니다.


  3. SortedList는 나중에 SortedList8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.


  4. 스택은 나중에 Stack8742468051c85b06f0a0af9e3e506b5c로 대체되었습니다.

스레드로부터 안전한 컬렉션 클래스

  1. ConcurrentQueue 스레드로부터 안전한 Queue


  2. ConcurrentStack 스택의 스레드 안전 버전


  3. ConcurrentBag 스레드로부터 안전한 객체 컬렉션


  4. ConcurrentDictionary 스레드로부터 안전한 사전


  5. BlockingCollection

.NET에서 제공하는 컬렉션 클래스는 가장 일반적으로 사용되는 도구 클래스 중 하나입니다. 이 문서가 모든 사람이 이러한 컬렉션 클래스를 더 잘 이해하는 데 도움이 되기를 바랍니다. 물론 개인적으로 아직 불완전한 부분이 있다고 생각합니다. 예를 들어 HashTable과 Binary Search Tree는 자세히 연구되지 않았으며, 단방향 연결 목록과 이중 연결 목록의 비교는 이 기사에서 언급되지 않았습니다. 관심 있는 친구들은 이에 대해 더 자세히 알아볼 수 있습니다.

위 내용은 C# 컬렉션 유형의 그래픽 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.