2011-11-13 91 views
22

我有字典Dictionary<string, Point>如何排序的字典鍵

關鍵是C1,C3,C2,T1,T4,T2我想對它們進行排序爲C1,C2,C3,T1,T2, T3

我試圖使用

Input.OrderBy(key => key.Key); 

進行排序,但它不工作

任何想法如何解決

+1

它沒有排序,或者只是不按照您期望的順序? –

+0

不 – AMH

+1

http://stackoverflow.com/questions/289/how-do-you-sort-a-c-sharp-dictionary-by-value 引用排序,這樣它有一些很好的例子。 –

回答

-5

確定檢查這一點,應該工作

var r = new Dictionary<string, Point>(); 
r.Add("c3", new Point(0, 0)); 
r.Add("c1", new Point(0, 0)); 
r.Add("t3", new Point(0, 0)); 
r.Add("c4", new Point(0, 0)); 
r.Add("c2", new Point(0, 0)); 
r.Add("t1", new Point(0, 0)); 
r.Add("t2", new Point(0, 0)); 
var l = r.OrderBy(key => key.Key); 
var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value); 

foreach (var item in dic) 
{ 

    Console.WriteLine(item.Key); 
} 
Console.ReadLine(); 
+1

-1:這不會工作。您只是創建了另一個沒有排序的字典。它可能適用於小型字典,但最終會失敗。 – leppie

+0

我們在聊天時發了脾氣,我知道他想要什麼,所以我幫助他解決了他的問題 – DeveloperX

+10

@DeveloperX - 我的猜測是人們投票不起作用,因爲它沒有回答問題。我們沒有看到聊天,所以人們可能不認爲這是我們看到的問題的有用答案。 –

5

只是猜測,但它看起來像你正在假設它將排序輸入。 OrderBy方法實際上會返回包含相同值的IOrderedEnumerable的有序實例。如果你想保留的返回值,你可以做以下:

IOrderedEnumerable orderedInput 
orderedInput = Input.OrderBy(key=>key.Key) 

,將修改集合大多數方法遵循相同的模式。它這樣做是爲了不改變原始收藏實例。這樣可以防止您在無意的情況下意外更改實例。如果您只想使用已排序的實例,則只需將該變量設置爲方法返回,如上所示。

25

Input.OrderBy不對字典進行排序,它會創建一個按有序順序返回項目的查詢。

也許OrderedDictionary給你你想要的。

或者使用通用SortedDictionary

+0

但它不是通用的,它的性能將會是問題 – AMH

+2

@AMH不要對性能做出假設,直到你真實地測試它(微 - 基準不計算)。 – Richard

+2

你怎麼知道性能會成爲問題? –

0

我用

var l = Input.OrderBy(key => key.Key); 

,我把它轉換到字典

+1

A我說過:這不會對字典進行排序!它創建一個排序的「視圖」。 –

4

裝入未分類的對象爲像這樣的SortedDictionary對象:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData); 

其中unsortedCustomerData是相同的泛型類型(字符串,字符串或在您的案例字符串,點)。它會自動按鍵排序新對象

根據msdn:SortedDictionary(IDictionary):初始化SortedDictionary類的新實例,該實例包含從指定的IDictionary複製的元素,並將默認的IComparer實現用於鍵類型。

2

以下代碼使用另外兩個list s到sort一個字典。

using System; 
using System.Collections.Generic; 
using System.Drawing; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      Dictionary<string,Point> r=new Dictionary<string,Point>(); 
      r.Add("c3",new Point(0,1)); 
      r.Add("c1",new Point(1,2)); 
      r.Add("t3",new Point(2,3)); 
      r.Add("c4",new Point(3,4)); 
      r.Add("c2",new Point(4,5)); 
      r.Add("t1",new Point(5,6)); 
      r.Add("t2",new Point(6,7)); 
      // Create a list of keys 
      List<string> zlk=new List<string>(r.Keys); 
      // and then sort it. 
      zlk.Sort(); 
      List<Point> zlv=new List<Point>(); 
      // Readd with the order. 
      foreach(var item in zlk) { 
       zlv.Add(r[item]); 
      } 
      r.Clear(); 
      for(int i=0;i<zlk.Count;i++) { 
       r[zlk[i]]=zlv[i]; 
      } 
      // test output 
      foreach(var item in r.Keys) { 
       Console.WriteLine(item+" "+r[item].X+" "+r[item].Y); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 

以上代碼的輸出如下所示。

c1 1 2 
c2 4 5 
c3 0 1 
c4 3 4 
t1 5 6 
t2 6 7 
t3 2 3 
2

由於Input.OrderBy創建一個按有序順序返回項目的查詢,只需將其分配給同一個字典。

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);