키 값 쌍 데이터 구조를위한 최상의 구현?
그래서 저는 최근에 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
'program tip' 카테고리의 다른 글
경로를 수행하지 않고 AngularJS에서 쿼리 매개 변수를 어떻게 설정할 수 있습니까? (0) | 2020.10.26 |
---|---|
빈 파일을 읽을 때 "Pickle-EOFError : Ran out of input"이 발생하는 이유는 무엇입니까? (0) | 2020.10.26 |
현대 시대의 포트란 배우기 (0) | 2020.10.26 |
C ++의 클래스 이니셜 라이저에서 const 배열 초기화 (0) | 2020.10.26 |
Facebook 좋아요 버튼-수 숨기기? (0) | 2020.10.26 |