2011-11-13 37 views
22

Tôi có Từ điển Dictionary<string, Point>Làm thế nào để sắp xếp một cuốn từ điển bằng phím

Key là c1, c3, c2, t1,, t4, t2 Tôi muốn sắp xếp chúng để có c1, c2, c3, t1, t2, t3

tôi đang cố gắng để sắp xếp nó bằng cách sử

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

nhưng nó không hoạt động

bất kỳ ý tưởng làm thế nào để giải quyết mà

+1

không có gì sắp xếp hay không theo thứ tự bạn mong đợi? –

+0

nó không sắp xếp – AMH

+1

http://stackoverflow.com/questions/289/how-do-you-sort-a-c-sharp-dictionary-by-value tham chiếu đến điều này nó có một số ví dụ rất tốt. –

Trả lời

-5

check ok này nó phải làm việc

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: Điều này sẽ không hoạt động. Bạn vừa tạo một từ điển khác không có thứ tự. Nó có thể làm việc cho các từ điển nhỏ nhưng cuối cùng sẽ thất bại. – leppie

+0

chúng tôi nói chuyện trong trò chuyện và tôi biết những gì anh ta muốn vì vậy tôi đã giúp anh ta giải quyết vấn đề của mình – DeveloperX

+10

@ DeveloperX - Tôi đoán là mọi người đang bỏ phiếu vì nó không trả lời câu hỏi. Chúng tôi không thấy trò chuyện, vì vậy mọi người có thể không coi đó là câu trả lời hữu ích cho câu hỏi mà chúng tôi thấy. –

5

Chỉ là một đoán nhưng có vẻ như bạn đang giả định nó sẽ sắp xếp đầu vào. Phương thức OrderBy thực sự trả về một thể hiện có thứ tự của một IOrderedEnumerable chứa các giá trị giống nhau. Nếu bạn muốn giữ giá trị trả lại, bạn có thể thực hiện như sau:

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

Hầu hết các phương pháp sẽ sửa đổi bộ sưu tập theo cùng mẫu này. Nó thực hiện điều này để nó không thay đổi cá thể thu thập dữ liệu gốc. Điều này bảo vệ bạn khỏi vô tình thay đổi cá thể khi bạn không có ý định. Nếu bạn chỉ muốn sử dụng thể hiện được sắp xếp thì bạn chỉ cần đặt biến cho phương thức trả về như được hiển thị ở trên.

25

Input.OrderBy không sắp xếp từ điển, nó tạo truy vấn trả về các mục theo thứ tự đã đặt hàng.

Có lẽ OrderedDictionary cung cấp cho bạn những gì bạn muốn.

Hoặc sử dụng Generic SortedDictionary

+0

nhưng không phải là Chung và hiệu suất của nó sẽ là vấn đề – AMH

+2

@AMH Đừng đưa ra giả định về hiệu suất cho đến khi bạn đã thử nghiệm nó thực tế (vi mô -biểu đồ không được tính). – Richard

+2

Làm thế nào để bạn biết hiệu suất sẽ là một vấn đề? –

0

tôi đã sử dụng

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

và tôi chuyển đổi nó vào từ điển

+1

A Tôi đã nói: điều này KHÔNG sắp xếp từ điển! Nó tạo ra một 'xem' được sắp xếp. –

4

tải các đối tượng không được phân loại vào một đối tượng SortedDictionary như sau:

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

Trường hợp unsortedCustomerData là cùng loại chung (chuỗi từ điển, chuỗi hoặc trong chuỗi trường hợp, điểm). Nó sẽ tự động sắp xếp đối tượng mới bằng phím

Theo msdn: SortedDictionary (IDictionary): Khởi tạo phiên bản mới của lớp SortedDictionary chứa các phần tử được sao chép từ IDictionary đã chỉ định và sử dụng cài đặt mặc định IComparer cho loại khóa.

2

Mã sau sử dụng hai thêm list s để sort từ điển.

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

Đầu ra của mã bên trên được hiển thị bên dưới.

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

Kể từ khi nhập.OrderBy tạo truy vấn trả về các mục theo thứ tự đã đặt hàng, chỉ cần gán nó vào cùng một từ điển.

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

Các vấn đề liên quan