2009-03-24 57 views
14

Tôi có thuộc tính trả về HashTable. Tôi muốn sắp xếp nó mà không cần tái cấu trúc tài sản của tôi. Xin lưu ý: Tôi không muốn trả lại loại khác. Code:Có thể sắp xếp một HashTable không?

/// <summary> 
    /// All content containers. 
    /// </summary> 
    public Hashtable Containers 
    { 
     get 
     { 
      Hashtable tbl = new Hashtable(); 
      foreach (Control ctrl in Form.Controls) 
      { 
       if (ctrl is PlaceHolder) 
       { 
        tbl.Add(ctrl.ID, ctrl); 
       } 
       // Also check for user controls with content placeholders. 
       else if (ctrl is UserControl) 
       { 
        foreach (Control ctrl2 in ctrl.Controls) 
        { 
         if (ctrl2 is PlaceHolder) 
         { 
          tbl.Add(ctrl2.ID, ctrl2); 
         } 
        } 
       } 
      } 

      return tbl; 
     } 
    } 
+0

+1 Vì downvote! Đó là một câu hỏi hoàn toàn hợp lệ từ một người không hiểu HashTable là gì! –

+0

+1 vì downvote. Câu hỏi cho thấy poster không biết cách HashTables làm việc, nhưng là một chủ đề hoàn toàn hợp lệ. – snemarch

+1

@agassan: Tôi đã dọn sạch bài đăng của bạn một chút để nó được gắn kết hơn và xóa câu hỏi LINQ vì điều đó dường như không phải là những gì bạn thực sự yêu cầu. Vui lòng quay lại nếu bạn không thích điều này. –

Trả lời

8

Một tùy chọn khác là xây dựng bảng băm như bạn đã làm, và sau đó chỉ cần xây dựng một bộ được sắp xếp từ các phím. Bạn có thể lặp qua bộ khóa được sắp xếp đó, tìm nạp giá trị tương ứng từ bảng băm khi cần.

+0

Đây là chính xác như thế nào tôi đã có thể làm cho nó hoạt động. – user81740

3

Xin lỗi, nhưng bạn không thể loại Hashtable. Bạn sẽ phải cấu trúc lại mã của bạn để sử dụng một số bộ sưu tập có thể sắp xếp.

6

Lubos là đúng: bạn không thể loại một Hashtable. Nếu bạn có thể, nó sẽ không phải là một HashTable. Bạn có thể liệt kê HashTable, và sau đó sắp xếp liệt kê. Nhưng điều đó sẽ rất chậm. Tốt hơn hết là nên sử dụng một số SortedDictionary.

0

Không có điểm nào trong việc sắp xếp bảng băm vì bạn đã có thời gian tra cứu gần như không đổi. Hoặc ở mức thấp nhất O (B) trong đó B là kích thước thùng.

18

Hashtables hoạt động bằng cách ánh xạ khóa tới giá trị. Ngụ ý trong bản đồ này là khái niệm rằng các phím không được sắp xếp hoặc lưu trữ theo bất kỳ thứ tự cụ thể nào.

Tuy nhiên, bạn có thể xem SortedDictionary<K,V>.

+0

Cảm ơn. Hoạt động tuyệt vời. Tôi đã rất dễ dàng để bất động sản lò phản ứng kể từ khi hầu hết các yếu tố thả xuống của tôi bằng cách sử dụng Key Pair Value – user81740

1

Bạn sẽ cần phải trả lại thứ gì đó không phải là bảng băm. Tôi sẽ không nhắc lại những gì bạn tuyên bố đã hiểu, nhưng bạn cần phải suy nghĩ lại bất cứ phần nào trong thiết kế của bạn yêu cầu bạn trả về các đối tượng đã sắp xếp trong bảng băm.

0

Tất nhiên bảng băm có thể được sắp xếp, nhưng trước tiên bạn cần xác định ý nghĩa của việc sắp xếp bảng băm. Tuy nhiên, một khi bạn đã làm điều đó, bạn đã luôn loại bỏ tất cả những ưu điểm mà một hashtable có thể cung cấp cho bạn, và bạn cũng có thể sử dụng một mảng được sắp xếp (với tìm kiếm nhị phân), hoặc sử dụng một cây đỏ đen thay vào đó.

1

Không chính xác câu trả lời C# nhưng tôi chắc chắn bạn có thể làm một điều gì đó.

Trong Perl, thông thường "sắp xếp" bảng băm để sử dụng trong đầu ra cho màn hình.

Ví dụ:

print "Items: "; 
foreach (sort keys %items) { 
    print $_, '=', $items{$_}, ' '; 
} 

Bí quyết ở đây là Perl không sắp xếp băm, nó được sắp xếp một danh sách sao chép các phím băm. Nó sẽ được dễ dàng đủ trong C# để trích xuất các khóa băm vào một danh sách và sau đó sắp xếp danh sách đó.

+0

Tôi đã làm điều đó, bằng cách tạo đối tượng SortList sau đó lặp qua các giá trị hashtable và đặt các giá trị vào SortList và sau đó sortList.Sort() – user81740

0

Tôi là một lập trình viên mới nên hãy lấy mọi thứ tôi nói với một hạt muối. Nhưng đây là những gì tôi đã làm khi tôi chạy vào một tình huống tương tự. Tôi tạo ra một lớp có hai biến và sau đó tạo ra một đối tượng List tắt các biến đó và sau đó tôi đã sử dụng LINQ để sắp xếp các biến đó.

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