program tip

키 값 쌍 데이터 구조를위한 최상의 구현?

radiobox 2020. 10. 26. 07:53
반응형

키 값 쌍 데이터 구조를위한 최상의 구현?


그래서 저는 최근에 C #을 조금씩 다루고 있는데 모든 Generic Collections는 저를 약간 혼란스럽게 만듭니다. 트리의 헤드가 키 값 쌍인 데이터 구조를 나타내고 싶고 그 아래에 키 값 쌍의 선택적 목록이 하나 있다고 가정합니다 (하지만 이보다 더 많은 수준은 없음). 이것이 적합할까요?

public class TokenTree
{
    public TokenTree()
    {
        /* I must admit to not fully understanding this,
         * I got it from msdn. As far as I can tell, IDictionary is an
         * interface, and Dictionary is the default implementation of
         * that interface, right?
         */
        SubPairs = new Dictionary<string, string>();
    }

    public string Key;
    public string Value;
    public IDictionary<string, string> SubPairs;
}

데이터를 전달하는 것은 정말 간단한 션트 일뿐입니다.


KeyValuePair라는 실제 데이터 유형이 있습니다.

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");

당신이 할 수있는 한가지 가능한 일은 바로 Dictionary 객체를 사용하고 당신 자신의 수정으로 그것을 확장하는 것입니다 :

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

이렇게하면 키에 IDictionary 규칙 (예 : 키 고유성 등)을 적용 할 필요가 없다는 이점이 있습니다.

그리고 당신은 생성자의 개념을 맞았습니다 :)


나는 당신이 (당신의 질문의 문자 그대로 구현으로서) 당신이 추구 할 수 있다고 생각합니다.

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

    IDictionary<string, IDictionary<string, string>> tree; 
}

실제로 질문에서 키-값의 "목록"을 말 했으므로 내부를 다음 IDictionary과 같이 바꿀 수 있습니다 .

IList<KeyValuePair<string, string>>

KeyValuePair 내장 유형이 있습니다. 사실, 이것이 IDictionary가 당신이 그것을 반복 할 때 접근 할 수있는 권한을주는 것입니다.

또한이 구조는 나무가 아니므로 더 대표적인 이름을 찾는 것이 좋은 연습 일 수 있습니다.


여기에 추가 할 한 가지만 있습니다 (다른 사람이 이미 질문에 대한 답변을 받았다고 생각하지만). 확장 성 (우리 모두가 어느 시점에서 일어날 것이라는 것을 알고 있기 때문에)의 이익을 위해 컴포지트 패턴 을 확인하고 싶을 수 있습니다. 이것은 "트리와 유사한 구조"작업에 이상적입니다.

제가 말했듯이, 저는 당신이 하나의 하위 레벨만을 기대하고 있다는 것을 알고 있지만 이것은 나중에 ^ _ ^을 확장해야 할 때 정말 유용 할 수 있습니다.


@ Jay Mooney : .NET의 일반 사전 클래스는 실제로 고정 된 유형 만있는 해시 테이블입니다.

두 코드 조각을 두 유형 모두에 사용할 수 있으므로 여러분이 보여준 코드는 누구에게도 Dictionary 대신 Hashtable을 사용하도록 설득해서는 안됩니다.

해시 테이블의 경우 :

foreach(object key in h.keys)
{
     string keyAsString = key.ToString(); // btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

사전의 경우 :

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

KeyValuePair를 사용하는 다른 버전과 동일하게 Hashtable에는 일반 버전을 사용하고 Dictionary에는 일반 버전을 사용하십시오.

따라서 두 가지 방법 모두 쉽지만 Hashtable은 키와 값 모두에 Object를 사용합니다. 즉, 모든 값 유형을 상자에 넣을 수 있고 유형 안전성이 없으며 Dictionary는 제네릭 유형을 사용하므로 더 좋습니다.


Dictionary Class is exactly what you want, correct.

You can declare the field directly as Dictionary, instead of IDictionary, but that's up to you.


Use something like this:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

It's ugly, but I think it will give you what you want. Too bad KeyValuePair is sealed.

참고URL : https://stackoverflow.com/questions/8800/best-implementation-for-key-value-pair-data-structure

반응형