2014-01-08 2 views
0

키 길이로 정렬 할 정렬 된 사전이 있습니다.키 문자열 길이로 사전을 정렬하는 방법

사전과 같이 정의된다

private SortedDictionary<String, String> _replacementDictionary; 

과 같이 초기화 : 나는 다음과 같이 정의하여 정렬을 사용할 수 있다고 생각

_replacementDictionary = new SortedDictionary<string, string>(new LengthComparer()); 

:

class LengthComparer : IComparer<String> 
{ 
    public int Compare(string x, string y) 
    { 
     return x.Length.CompareTo(y.Length); 
    } 
} 

을하지만이되지 않습니다 같은 길이의 키들에 대한 작업. 내가 키 "ABC"와 "XYZ"나는 사전

+3

당신이 "작동하지 않는"무엇을 의미합니까 : 여기

using System.Collections.Generic; public class KeyLengthSortedDictionary : SortedDictionary<string, string> { public int Compare(string x, string y) { if (x == null) throw new ArgumentNullException(nameof(x)); if (y == null) throw new ArgumentNullException(nameof(y)); var lengthComparison = x.Length.CompareTo(y.Length); return lengthComparison == 0 ? string.Compare(x, y, StringComparison.Ordinal) : lengthComparison; } public KeyLengthSortedDictionary() : base(new StringLengthComparer()) { } } 

는 데모입니까? – wudzik

+0

글쎄,이 비교자는 분명히 문자열의 길이에 대해서만 * 상관합니다. 더 많이하고 싶다면 코드를 작성해야합니다. – Jon

+1

길이를 반환하기 위해 GetHashCode를 재정의 할 수 있습니까? – i3arnon

답변

3

당신이 길이로 정렬 할 말은 경우를 열거이 쇼의 하나를 추가하는 경우 즉, 문자열로 다음 키 자체는 시도 :

class LengthComparer : IComparer<String> 
{ 
    public int Compare(string x,string y) 
    { 
     int lengthComparison=x.Length.CompareTo(y.Length) 
     if(lengthComparison==0) 
     { 
      return x.CompareTo(y); 
     } 
     else 
     { 
      return lengthComparison; 
     } 
    } 
} 

이 코드의 기능은 다음과 같습니다. 길이에 따라 비교합니다. 두 개의 문자열이 길이에 대해 연결되어 있으면 길이가 아닌 문자열 자체를 비교하여 연결을 해결합니다. @ Adriano가 그의 코멘트에서 준 이유 때문에이 동점을 해결할 필요가 있습니다. 당신은 IComparer의 경로를 계속하고 싶다고 지정하지 않은

+1

그것이 작동하지만, 몇 가지 이유를 넣어 – wudzik

+0

@ wudzik, 나는 그것이 자기 설명 코드라고 생각했지만, 경우에 대비해서 설명을 추가했다. –

+4

@wudzik MSDN : "_ SortedDictionary 의 모든 키는 지정된 comparer._에 따라 고유해야합니다." 길이 만 비교하면 해당 문자열은 동등한 것으로 간주됩니다. –

0
List<KeyValuePair<string, string>> list = _replacementDictionary.ToList(); 

list.Sort((firstPair, nextPair) => 
    { 
     return firstPair.Key.Length.CompareTo(nextPair.Key.Length); 
    } 
); 

_replacementDictionary = list.ToDictionary(pair => pair.Key, pair => pair.Value); 

그래서이 코드는 여전히 적합 바랍니다. 필요한 경우 확장명으로 묶을 수 있습니다.

참고 : 지금은 시도하거나 컴파일 할 수 없으므로 조금만 정리해야 할 수도 있습니다.

관련 문제