2012-05-08 14 views
9

Jak można sortować HashSet<string> w C# .Net 3.5?Sortowanie Hashset .Net 3.5

+4

Nie możesz. 'HashSet' nie jest sortowany według definicji. Czy chcesz utworzyć posortowaną kopię, która jest tablicą? – svick

+2

Sortować w miejscu lub posortowaną kopię? –

Odpowiedz

8

Możesz użyć metody OrderBy, albo kompilatora danych (tj. http://msdn.microsoft.com/en-us/library/bb549422.aspx) lub używając swojego porównywalnika liniowo z niektórymi lambdami (zwykle używam predykatów dla moich porównań jak na poniższym przykładzie).

Zobacz jak na linku:

 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 
     */ 

Więcej: http://msdn.microsoft.com/en-us/library/bb534966.aspx

+7

To oczywiście nie sortuje samego hashset, ale zwraca posortowany widok hashset. – CodesInChaos

+3

Tak, to prawda, wartości zawarte w HashSet nie są posortowane, ale można uzyskać do nich dostęp w posortowanym widoku (lub kopii). – ericosg

21

Nie. Z definicji plik HashSet nie jest posortowany.

Jeśli chcesz posortowany zestaw haszysz, powinieneś użyć SortedSet. Wyeksponowane metody są w zasadzie nadzbiorem tych dostarczonych przez HashSet, w tym możliwością sortowania jego zawartości.

+2

Należy zauważyć, że SortedSet nie będzie zawierał różnych wartości, które można uzyskać podczas używania HashSet, ale można załadować Distinct wartości podczas konstruowania go z odpowiednią metodą rozszerzenia. – ericosg

+1

@ericosg Nie rozumiem twojego komentarza. – CodesInChaos

+1

Miałem na myśli, jeśli potrzebujesz Wyjątkowych wartości w SortedSet, musisz wywołać .Distinct(), aby uzyskać wyraźny widok z nich. Jeśli potrzebujesz posortowanego HashSet, musisz wywołać funkcję .OrderBy(), aby uzyskać posortowany widok. – ericosg

8

HashSet < ciąg > nie jest posortowana według projektu. Jeśli chcesz, aby sortować elementy raz (~ nie często), a następnie można użyć OrderBy metodę LINQ (bo HashSet < ciąg implementuje IEnumerable < > ciąg >): hs.OrderBy (s => s);

Jeśli potrzebujesz posortowaną hashset następnie można użyć SortedDictionary klasę - wystarczy użyć trochę obojętne typ (tj bool) dla TValue generycznego parametru.

Klasa SortedSet nie jest dostępna w .NET 3.5.

Powiązane problemy