2014-02-18 140 views
-2

請找到他附加的圖像。 enter image description here基於字典中的鍵排序

ls是dicionary<string, string>。我想根據關鍵字進行排序。但是,如果密鑰類似於

7020_1,7020_23,7030_5。 7020_8,7030_1。

我希望它被安排爲

7020_1,7020_8,7020_23,7030_1.7030_5。

讓我知道解決方案。

+0

讓我們知道您到目前爲止嘗試過的。 –

回答

2

這裏一個簡單的解決方案。

Dictionary<string, string> d = dic.OrderBy(x => int.Parse(x.Key.Split('_')[0])).ThenBy(x => int.Parse(x.Key.Split('_')[1])).ToDictionary(j => j.Key, j => j.Value); 
+0

這可能適用於此示例,但最終對象是未訂購的字典。如果它有效,那只是實施的好運。 – Baldrick

+0

下面是我對主人的意思的一個很好的解釋! http://stackoverflow.com/questions/6384710/why-is-a-dictionary-not-ordered – Baldrick

+0

感謝您的意見Baldrick! ;)它們很有用! –

2

拆分您的字符串解析,然後爲了你應該使用:

SortedDictionary(TKEY,TValue),讓你的IComparer(T)接口則其將被排序的自己的規則。

更多:SortedDictionaryIComparer

2

這裏是一個簡短的控制檯應用程序演示瞭解決方案:

class KeyComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var xSplit = x.Split('_').Select(i => Convert.ToInt32(i)).ToArray(); 
     var ySplit = y.Split('_').Select(i => Convert.ToInt32(i)).ToArray(); 
     var diff1 = xSplit[0] - ySplit[0]; 
     return diff1 != 0 ? diff1 : xSplit[1] - ySplit[1]; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var comparer = new KeyComparer(); 
     var sortedDic = new SortedDictionary<string, object>(comparer) 
     { 
      {"7020_23", new object()}, 
      {"7030_1", new object()}, 
      {"7030_5", new object()}, 
      {"7020_8", new object()}, 
      {"7020_1", new object()} 
     }; 

     foreach (var key in sortedDic.Keys) 
     { 
      Console.WriteLine(key); 
     } 
    } 
} 

輸出是:

7020_1 
7020_8 
7020_23 
7030_1 
7030_5 

請注意,此解決方案假定關鍵是總是由2部分組成,可以解析爲整數,並由u nderscore。

1

您需要創建自己的Comparer以傳遞到OrderBy,因爲您需要進行整數比較而不是字符串。我使用了List,但這並沒有改變。

static void Main(string[] args) 
    { 
     var d = new List<string>() { "7020_8", "7030_5", "7020_23", "7020_1", "7030_1" }; 

     Console.WriteLine("In:"); 
     foreach (string s in d) 
      Console.WriteLine(s); 

     Console.WriteLine(); 

     Console.WriteLine("Sorted Out:"); 
     foreach (string s in d.OrderBy(f => f, new MyComparer())) 
      Console.WriteLine(s); 

     Console.ReadLine(); 
    } 

    internal class MyComparer : IComparer<string> 
    { 

     #region IComparer<string> Members 

     public int Compare(string x, string y) 
     { 
      //return <0 if x < y, 0 if x = y, >0 if x > y 

      //if the strings are equal return 0 now 
      if (x.CompareTo(y) == 0) 
       return 0; 

      int x1, x2; 
      int y1, y2; 
      //split the strings on _ 
      x1 = Convert.ToInt32(x.Split('_')[0]); 
      x2 = Convert.ToInt32(x.Split('_')[1]); 

      y1 = Convert.ToInt32(y.Split('_')[0]); 
      y2 = Convert.ToInt32(y.Split('_')[1]); 

      //compare the first part 
      if (x1.CompareTo(y1) == 0) 
       //first parts are equal so compare the second 
       return x2.CompareTo(y2); 
      else 
       return x1.CompareTo(y1); 
     } 

     #endregion 
    } 

注意你應該明顯改善MyComparer類,我只是假設該字符串轉換爲整數等