2011-09-27 2 views
49

Namestring 유형을 포함하는 클래스 (SomeClass)가 있습니다. 그리고 그 클래스의 배열을 저장하고 이름으로 아이템을 찾아야합니다. 이 목적을 위해 KeyedCollectionDictionary의 두 가지 유형의 콜렉션이 있습니다. 내 질문입니다 : 그 (것)들과 무슨 차이가 그런 경우에 KeyedCollectionDictionary를 사용하는 것이 낫습니까? 설명에 도움을 주셔서 감사합니다.사전 또는 KeyedCollection?

+2

적어도 직렬화 프로세스를 제어 할 수 있다면 KeyedCollection의 장점 중 하나는 List <> 부분을 직렬화하고 "유선으로"보내면된다는 것입니다. Dictionary <> 부분은 List <> 부분의 비 직렬화의 일부로 수신 측에서 다시 작성할 수 있기 때문에 직렬화하거나 보낼 필요가 없습니다. – RenniePet

답변

-11

KeyedCollection은 초록이기 때문에 사용할 수 없습니다 : http://msdn.microsoft.com/en-us/library/ms132438.aspx. 즉, 개체를 만들 수 없습니다.

+11

그것은 상속을 위해 특별히 설계되었으므로 OP가 요구하는 비교는 사전과 KeyedCollection에서 상속 한 것을 사용하는 것 사이에 있습니다. – mattmc3

14

여기에 사전 및 KeyedCollection 사이의 차이점에 대한 좋은 설명입니다

  • KeyedCollection 추상적 인, 그래서 당신이 직접 사용할 수 없습니다 http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

    주요 포인트이다.

  • KeyedCollection은 키가 엔터티 자체에있을 때 유용하며 컬렉션 구현 내에서 키 검색을 캡슐화 할 수 있습니다.
  • 프레임 워크가 아닌 KeyedCollection에 대한 일반적인 구현이 있습니다. 키 생성 위임을 컬렉션 생성자에 붙여 넣을 수 있으므로 항목을 추가 할 때마다 반복하지 않아도됩니다.
5

기본적으로 KeyedCollection은 사전 아래에 사전을 만듭니다.
Key가 값의 일부로 의미를 가지며 고유성을 정의하는 경우 KeyedCollection의 목적입니다. 이전 코멘트

protected KeyedCollection(
IEqualityComparer<TKey> comparer, 
int dictionaryCreationThreshold) 
58

없음 둘 사이의 가장 중요한 차이점 해결하지 : 당신이 다음이 ctor에 사용하는 사전 지원을 수정하려면

는 KeyedCollection을 그들이 순서대로 항목을 유지 추가되었습니다 (추가 된 첫 번째 항목은 인덱스 0에 있고 마지막 추가 된 항목은 마지막 인덱스에 있음). 사전은 (또는 적어도 그렇게 할 수는 없습니다).

이처럼 KeyedCollection의 추가 이점은 성능 비용이 적습니다. 커버 아래에서, 당신은 사전과리스트를 유지하는 비용을 지불합니다.

+0

답변으로 표시해야합니다. – Ted

+3

특히 Remove() 메서드는 다소 비효율적 인 것처럼 보입니다. 목록을 순차적으로 검색하여 제거 할 항목을 찾은 다음 나머지 항목을 한 위치 왼쪽으로 이동합니다. – RenniePet

+0

"KeyedCollection은 성능 비용이 적습니다."하지만 아마도 사용 방식에 따라 달라질 수 있습니다. 예를 들어, 사전보다 약간 더 잘 수행 할 수도 있습니다 [foreach 루프에서 과도하게 사용되는 경우] (http://stackoverflow.com/a/15904926/340045) 맞습니까? – Ben

4

KeyedCollection은 변경 가능한 키와 키의 변경을 관리하는 방법을 허용합니다. 사전은 키 변경을 허용하지 않습니다. 둘째, 조회가 필요한 모음이있는 경우 엔티티에서 키를 추출하는 논리는 한 곳에서 유지됩니다. 반면 사전을 유지하면 항목이 사전에 추가/제거되는 각 위치에 키 추출 논리를 배치해야합니다.

0

KeyedCollection은 키가 항목 자체에있을 때 사용해야합니다.

기본적으로 KeyedCollection은 사전 주위에 Collection<TItem> 래퍼입니다. 소규모 컬렉션을 사용하거나 항목 검색을 선호하는 경우 dictionaryCreationThreshold 매개 변수를 사용하는 KeyedCollectionprovides a constructor은 어떤 컬렉션 수를 Dictionary으로 전환 할 것인지 나타냅니다.
KeyedCollection의 또 다른 특징은 키 유형을 (유형이 일치하는 한) 전환 할 수 있다는 것입니다. 더블 키드 아이템 등에 좋을 수 있습니다. Performwise, KeyedCollection 인스턴스를 많이 생성하거나 정말로 큰 컬렉션을 사용하는 경우를 제외하고 사전 포장은 많은 오버 헤드가 없다고 생각합니다. 사전이 있는지 확인하기 위해 내부 null 검사가 있습니다.
KeyedCollection에서 볼 수있는 한 가지는 un abstract입니다. 그러나 일반적인 콘크리트 유형을 쉽게 만들 수 있습니다.