본문 바로가기
C#

[C#] IDictionary<TKey,TValue>, IReadOnlyDictionary<TKey,TValue>, IDictionary

by DANEW 2023. 9. 20.

IDictionary<TKey,TValue> 인터페이스

 

IDictionary<TKey,TValue> 인터페이스 (System.Collections.Generic)

키/값 쌍의 제네릭 컬렉션을 나타냅니다.

learn.microsoft.com

- 모든 키-값 쌍 기반 컬렉션의 표준 프로토콜을 정의
- 임의의 형식의 키에 기초해서 요소들에 접근하는 메서드들과 속성들을 추가해서 ICollection<T>를 확장함
namespace System.Collections.Generic
{
    public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
    {        
        TValue this[TKey key] { get; set; } // 주 인덱서(키로 접근)
        ICollection<TKey> Keys { get; }     // 키
        ICollection<TValue> Values { get; } // 값
 
        void Add(TKey key, TValue value);
        bool ContainsKey(TKey key);
        bool Remove(TKey key);
        bool TryGetValue(TKey key, out TValue value);
    }
}
- 항목 추가: Add(이미 존재한다면 예외) 혹은 인덱서(이미 존재한다면 갱신)
- 항목 조회: TryGetValue(없다면 false) 혹은 인덱서(없다면 예외)
- 존재 유무: ContainsKey
 
namespace System.Collections.Generic
{
    public struct KeyValuePair<TKey, TValue>
    {
        public KeyValuePair(TKey key, TValue value);
        public TKey Key { get; }
        public TValue Value { get; }
        public override string ToString();
    }
}

- IDictionary<TKey,TValue>를 직접 열거하면 위와 같은 KeyValuePair 구조체의 순차열을 얻게 됨

 

IReadOnlyDictionary<TKey,TValue> 인터페이스

 

IReadOnlyDictionary<TKey,TValue> 인터페이스 (System.Collections.Generic)

키/값 쌍의 제네릭 읽기 전용 컬렉션을 나타냅니다.

learn.microsoft.com

namespace System.Collections.Generic
{
    public interface IReadOnlyDictionary<TKey, TValue> : IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
    {
        TValue this[TKey key] { get; }
 
        IEnumerable<TKey> Keys { get; }
        IEnumerable<TValue> Values { get; }
 
        bool ContainsKey(TKey key);
        bool TryGetValue(TKey key, out TValue value);
    }
}

- 사전 멤버들의 읽기 전용 부분집합을 정의

IDictionary 인터페이스

 

IDictionary 인터페이스 (System.Collections)

키/값 쌍의 제네릭이 아닌 컬렉션을 나타냅니다.

learn.microsoft.com

namespace System.Collections
{
    public interface IDictionary : ICollection, IEnumerable
    {
        object this[object key] { get; set; }
        ICollection Keys { get; }
        ICollection Values { get; }
 
        void Add(object key, object value);        
        bool Contains(object key);
        void Remove(object key);
 
        bool IsReadOnly { get; }
        bool IsFixedSize { get; }
        void Clear();
 
        IDictionaryEnumerator GetEnumerator();
    }
}
- 기본적으로 IDictionary<TKey,TValue>와 같음
- 중요한 2가지 차이점
 * 인덱서를 통해 존재하지 않는 키를 조회하는 경우 null을 돌려줌(예외가 아님)
 * ContainsKey가 아닌 Contains
namespace System.Collections
{
    public struct DictionaryEntry
    {
        public DictionaryEntry(object key, object value);
 
        public object Key { get; set; }
        public object Value { get; set; }
    }
}

 

- IDictionary에 대해 열거하면 위와 같은 DictionaryEntry 구조체의 순차열을 얻게 됨
반응형