2014-02-18 142 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类,我只是假设该字符串转换为整数等