2010-01-25 2 views
2

이 질문에 대한 해결책은 =>General type conversion without risking Exceptions입니다. (질문 하단의 편집을 참조하십시오.) 두 가지 유형을 변환하는 방법을 캐시해야합니다.두 개의 키를 가진 콜렉션

따라서 Type1과 Type2가 주어지면 메소드를 검색해야합니다.

이 질문에 대한 답변 =>What is the best C# collection with two keys and an object? 사전의 사전을 사용하는 것이 좋습니다. 이것은 내가하고있는 것과 비슷합니다.

그러나 나는 그것을 좋아하지 않는다. 컬렉션이 의미하는 바를 논리적으로 전달하지 않습니다. 또한 값을 검색하려면 다음을 수행해야합니다.

 if (!_Types.ContainsKey (s.GetType())) 
     { 
      type1Cache = new Dictionary<Type, ConversionCache>(); 

      _Types.Add (s.GetType(), type1Cache); 
     } 
     else 
     { 
      type1Cache = _Types[s.GetType()]; 
     } 

     if (!type1Cache.ContainsKey (value.GetType())) 
     { 
      // We havent converted this type before, so create a new conversion 
      type2Cache = new ConversionCache (s.GetType(), value.GetType()); 

      // Add to the cache 
      type1Cache.Add (value.GetType(), type2Cache); 
     } 
     else 
     { 
      type2Cache = type1Cache[value.GetType()]; 
     } 

약간 길다.

난 그냥 유형의 문자열 값을 연결하는 것입니다

 if (!_Types.ContainsKey (s.GetType(), value.GetType())) 
     { 
      cache = new ConversionCache (s.GetType(), value.GetType()); 

      _Types.Add (s.GetType(), value.GetType(), cache); 
     } 
     else 
     { 
      cache = _Types[s.GetType(), value.GetType()]; 
     } 

하나 개의 솔루션처럼 뭔가를 할 수 있습니다. 뭔가 같이 :

 if (!_Types.ContainsKey (s.GetType().ToString() + ":" + value.GetType().ToString())) 
     { 
      cache = new ConversionCache (s.GetType(), value.GetType()); 
      _Types.Add (s.GetType().ToString() + ":" + value.GetType().ToString(), cache); 
     } 
     else 
     { 
      cache = _Types[s.GetType().ToString() + ":" + value.GetType().ToString()]; 
     } 

나는이 있기 때문에이 경우에 작동합니다 알고있는 일대일 형식과 문자열 표현 사이.

하지만 냄새가 아주 좋지 않으며 다른 상황에서는 작동하지 않습니다.

더 좋은 방법이 있나요?

답변

1

당신이하고있는 방식대로 좋습니다. 더 나은 "냄새"시스템을 원한다면 두 입력 (또는 유형)을 가져와 고유 한 문자열을 반환하는 도우미 함수 만 있으면됩니다. 그런 다음 키를 생성하는 구현 세부 사항 (이 경우 ":"구분 기호로 연결)이 숨겨집니다.

조금 지나치게 공학적으로 보입니다. 나는이 키 생성 방법을 변경해야하고 일반 클래스를 만들려고하지 않을 가능성이 많다고 생각하지 않습니다. 분명히 일반적인 클래스로해야 할 것입니다.

2

이전 버전에서는 KeyValuePair에서 Tuples (.Net 4) 또는 잘 알려진 "Pair"클래스를 원할 수 있습니다.

하지만 귀하의 요구 사항에 대해 생각해 보면, 아마도 맞춤 클래스를 선택하게 될 것입니다. hashcode/equals가 원하는 것을 수행하고 합리적인 로깅을 위해 ToString()을 재정의 할 수 있으며 어쨌든 훨씬 더 읽기 쉽습니다.