2009-08-25 5 views
3

가벼운 구조에 키 값 쌍 목록의 목록을 저장하려고합니다. 이것은 너무 성가시다. 뭐가 더 나은가요? 목록 < 사전 < 문자열, 문자열 > > 많은 오버 헤드를 추가합니까? 어떤 다른 옵션을 사용할 수 있습니까?List <KeyValuePair <string, string >>>을 어떻게 단축 할 수 있습니까?

+0

을 당신을 위해 최적화 무엇입니까? 구조가 어떻게 사용될 것입니까? 당신의 타입 선언에서 문자의 수를 최적화하고있는 것 같은데요) – ojrac

+0

네, 그냥보기가 번거롭지 않게하려고합니다 : – paulwhit

답변

9

는 속기에 대한 별칭 사용을 고려 :

namespace Application 
{ 
    using MyList = List<List<KeyValuePair<string, string>>>; 

    public class Sample 
    { 
     void Foo() 
     { 
      var list = new MyList(); 
     } 
    } 
} 
+0

그것에 대해 알지 못했지만, 많은 도움이되었습니다. 감사. – paulwhit

2

사전, < 문자열, 문자열> 및 목록 < KeyValuePair < 문자열, 문자열 >> 전달할 데이터에 따라 모두 괜찮을 수 있습니다. 또한, 만일 당신이 같은 장소에서 긴 타입을 사용하려고한다면, 다른 타입을 속기를 위해 정의 할 수 있습니다. 이런 식으로 뭔가 :

public class MyShorthand : List<List<KeyValuePair<string, string>>> { } 

또는 당신은 이런 유형의 별칭을 정의하기 위해 사용하는 문을 사용할 수 있습니다 :

using MyShorthand = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>>; 
+4

타입 별명을 지정하는 것이 좋습니다.'Using MyShorthand = List >>;' – Noldorin

+0

@ Noldorin : 특히 봉인 된 타입의 문제를 피할 수 있기 때문에 -이 경우 문제는 아니지만 ... –

+0

감사합니다! –

0

당신이 키를 사용하는 사전으로 값을 액세스하는 경우, 즉 무엇을 의미. 사전의 오버 헤드를 줄이려면 초기 용량을 시도하십시오.

public class MyDictionary 
{ 
    private Dictionary<string, string> values; 

    public MyDictionary() 
    { 
     values = new Dictionary<string, string>(); 
    } 

    public void Add(int index, string key, string value) 
    { 
     int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode(); 
     values.Add(hash, value); 
    } 
    public string Get(int index, string key) 
    { 
     int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode(); 
     return values[hash]; 
    } 
} 
+0

재미있는 ... 내 요구에 너무 많이. – paulwhit

3

모두 ListDictionary 꽤 효율적이다, 그래서 나는 않을 것 (두 목록 오히려 작은 경우)

다른 방법으로는, (예뻐 제외) 같은 것을 사용자 정의 해시 객체를 구현할 수 그들을 사용하는 것에 대해 두 번 생각하십시오. (당신이 목록에서 gazillion 사전을 저장하는거야,하지만 아주 일반적이지 아니라면.)

당신이 List<Dictionary<string, string>> 입력 너무 많이이라고 생각하면

, 당신은 당신의 전문에 말할 수

using LoDSS = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>; 

이것은 서브 클래 싱이 필요없는 별칭 일뿐입니다.

+0

틀린 점은 별칭이 별칭에 스택되지 않아서 대신 다음 코드를 사용해야한다는 것입니다. using LoDSS = System.Collections.Generic.List >; –

+0

나는 고쳐졌다. 이를 반영하기 위해 답변을 업데이트했습니다. – Ruben

0

명확성을 위해 귀하의 KeyValuePair<string, string>을 더 짧은 것으로 포장합니다 (예 : StringPair이고 또한 StringPair의 목록에 대한 속기를 정의합니다. 이렇게하면 구문이 짧아지고 IMHO 가독성이 향상됩니다.

public class StringPair : KeyValuePair<string, string> { } 

public class StringPairList : List<stringPair> { } 

.. 


var jaggedList = new List<StringPairList>(); 
+2

KeyValuePair는 봉인 된 클래스입니다.이 클래스에서 파생 될 수 없습니다. –

관련 문제