2016-11-12 97 views
0

我有一個字符串作爲關鍵字和整數列表的有序列表作爲值的字典;是否有可能根據c#中的值的順序進行排序?排序字典<字符串,列表<int>>基於值

例如: myDict:

{ 
    "hp",<10,14,23> 
    "dell", <6,8,9,10> 
    "asus", <6,9,18> 
    "mac", <7,98> 
} 

排序爲:

{ 
     "dell", <6,8,9,10> 
     "asus", <6,9,18> 
     "mac", <7,98> 
     "hp",<10,14,23> 
} 

這是我曾嘗試:

//this creates a dictionary with requirements stated above for testing 
Dictionary<string, List<int>> myDict = new Dictionary<string, List<int> 
      >(); 


     var numbers = "8,13,16,21,24,25,31,33,36,63,66,70,76,82,94".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("asus", numbers); 

     numbers = "6,84,90,99".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("dell", numbers); 

     numbers = "10,11,20,21,23,26,28,29,31,38,39,40,50,52,61,65,66,70,75,94".Split(',').Select(Int32.Parse).ToList(); 
     myDict.Add("hp", numbers); 

     numbers = "4,17,42,56,62,79,80".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("mac",numbers);    

是該做的部分分類:

var orderedDictionary = myDict.OrderByDescending(pairs => pairs.Value); 

上面給出的錯誤是「至少有一個對象必須實現IComparable」。 我也曾嘗試列表轉換爲字符串並執行以下操作:

var sortedDict = from entry in myDict 
          orderby entry.Value 
           ascending 
          select entry; 

的上方。然而工作它把數字作爲字符串;因此10,85之前會出現8,6我猜這是因爲「,」ASCII表示比數字更高。

如何在c#中對排序的整數列表進行排序?或通過檢查其他單元格上的每個單元格進行手動排序的唯一方法?

回答

1

你應該實現IComparer<T>List<int>

public MyListComparer : IComparer<List<int>> 
{ 
    public int Compare(List<int> x, List<int> y) 
    { 
     var minLength = x.Count < y.Count ? x.Count : y.Count; 
     for (var i = 0 ;i < minLength; i++) 
     { 
      if (x[i] > y[i]) 
      { 
       return 1; 
      } 
      if (x[i] < y[i]) 
      { 
       return -1; 
      } 
     } 
     if (x.Count > y.Count) 
     { 
      return 1; 
     } 
     if (y.Count > x.Count) 
     { 
      return -1; 
     } 
     return 0; 
    } 
} 

而且隨着this超載LINQ排序依據的使用它:

var orderedDictionary = myDict.OrderBy(pairs => pairs.Value, new MyListComparer()); 
+0

對於小的修改任職;而不是.length我用.count;因爲列表沒有長度方法。 – ibininja

+0

你是完全正確的,修復了我的答案。 – YuvShap

相關問題