2012-05-08 30 views
9

Làm cách nào để sắp xếp một số HashSet<string> trong C# .Net 3.5?Sắp xếp một Hashset .Net 3.5

+4

Bạn không thể. 'HashSet' không được sắp xếp theo định nghĩa. Bạn có muốn tạo một bản sao được sắp xếp của nó là một mảng không? – svick

+2

Sắp xếp tại chỗ hoặc bản sao được sắp xếp? –

Trả lời

8

Bạn có thể sử dụng phương pháp OrderBy, hoặc IComparer (ví dụ: http://msdn.microsoft.com/en-us/library/bb549422.aspx) hoặc sử dụng nội dung so sánh của bạn với một số lambda (tôi thường sử dụng biến vị ngữ để so sánh của tôi theo dưới đây).

Xem theo liên kết:

 class Pet 
     { 
      public string Name { get; set; } 
      public int Age { get; set; } 
     } 

     public static void OrderByEx1() 
     { 
      Pet[] pets = { new Pet { Name="Barley", Age=8 }, 
          new Pet { Name="Boots", Age=4 }, 
          new Pet { Name="Whiskers", Age=1 } }; 

      IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age); 

      foreach (Pet pet in query) 
      { 
       Console.WriteLine("{0} - {1}", pet.Name, pet.Age); 
      } 
     } 

     /* 
     This code produces the following output: 

     Whiskers - 1 
     Boots - 4 
     Barley - 8 
     */ 

Read more: http://msdn.microsoft.com/en-us/library/bb534966.aspx

+7

Điều này rõ ràng không tự sắp xếp hashset, nhưng trả về một khung nhìn được sắp xếp của hashset. – CodesInChaos

+3

Đúng vậy, các giá trị chứa trong một HashSet không được sắp xếp nhưng có thể được truy cập trong một khung nhìn đã sắp xếp (hoặc sao chép). – ericosg

21

Bạn không. Theo định nghĩa, HashSet không được sắp xếp.

Nếu bạn muốn tập hợp băm được sắp xếp, thì bạn nên sử dụng SortedSet. Các phương pháp mà nó trưng ra về cơ bản là một phần lớn các phương thức được cung cấp bởi HashSet, bao gồm cả khả năng sắp xếp nội dung của nó.

+2

Lưu ý rằng một SortedSet sẽ không chứa các giá trị khác biệt mà bạn sẽ có khi sử dụng một HashSet, nhưng bạn có thể tải các giá trị khác biệt khi xây dựng nó với phương thức mở rộng thích hợp. – ericosg

+1

@ericosg Tôi không hiểu bình luận của bạn. – CodesInChaos

+1

Ý tôi là, nếu bạn cần các giá trị khác biệt trong một SortedSet bạn cần gọi .Distinct() để có được một cái nhìn riêng biệt về chúng. Nếu bạn cần một HashSet được sắp xếp, bạn cần gọi .OrderBy() để có được một khung nhìn được sắp xếp. – ericosg

8

HashSet < chuỗi > không được sắp xếp theo thiết kế. Nếu bạn muốn sắp xếp các mục lần (~ không thường xuyên) sau đó bạn có thể sử dụng OrderBy LINQ phương pháp (vì HashSet < chuỗi > thực hiện IEnumerable < chuỗi >): hs.OrderBy (s => s);

Nếu bạn cần sắp xếp HashSet sau đó bạn có thể sử dụng SortedDictionary lớp - chỉ cần sử dụng một số loại hình nộm (ví dụ: bool) cho TValue tham số chung.

Lớp SortedSet không khả dụng trong .NET 3.5.

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