2014-01-08 101 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

什麼叫 「不工作」 是什麼意思? – 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在評論中給出的理由,你需要解決這個問題。

+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); 

您還沒有指定你想繼續下行的IComparer路線,所以我希望這個代碼仍然是合適的。如果需要的話,你可以將它包裝在一個擴展名中。

注:我不能嘗試編譯它,因此可能需要清理一下。

0

這是我使用的。

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()) { } 
} 

這裏是一個演示:https://dotnetfiddle.net/plmFLL