문제

그래서 최근에 C#을 좀 살펴봤는데 모든 일반 컬렉션이 약간 혼란스럽습니다.트리의 헤드가 키 값 쌍이고 그 아래에 선택적인 키 값 쌍 목록이 하나 있는(그러나 이보다 더 많은 수준은 없음) 데이터 구조를 표현하고 싶다고 가정해 보겠습니다.이것이 적합할까요?

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에서 반복할 때 액세스를 제공하는 것입니다.

또한 이 구조는 나무가 아니기 때문에 보다 대표적인 이름을 찾는 것도 좋은 연습이 될 수 있습니다.

여기에 추가할 사항이 하나 있습니다(비록 귀하의 질문에 대해 이미 다른 사람들이 답변을 드린 것으로 생각되지만).확장성을 위해(우리 모두는 어느 시점에서 이런 일이 일어날 것이라는 것을 알고 있으므로) 다음을 확인하고 싶을 수도 있습니다. 복합 패턴 이는 "나무형 구조" 작업에 이상적입니다.

내가 말했듯이, 나는 당신이 하나의 하위 수준만을 기대한다는 것을 알고 있지만 나중에 확장해야 하는 경우 이것은 정말 유용할 수 있습니다 ^_^

@제이 무니:.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는 일반 유형을 사용하므로 더 좋습니다.

사전 클래스 정확히 당신이 원하는 것입니다. 맞습니다.

IDictionary 대신 Dictionary로 필드를 직접 선언할 수 있지만 이는 사용자에게 달려 있습니다.

다음과 같이 사용하십시오.

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

추악하지만 원하는 것을 얻을 것이라고 생각합니다.안타깝게도 KeyValuePair가 봉인되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top