2012-05-08 4 views
9

HashSet<string>을 C# .Net 3.5에서 어떻게 정렬 할 수 있습니까?해시 집합 정렬 .Net 3.5

+4

수 없습니다. 'HashSet'은 정의에 의해 정렬되지 않습니다. 배열 인 정렬 된 사본을 작성 하시겠습니까? – svick

+2

제자리 또는 정렬 된 사본 정렬? –

답변

8

IComparer (즉, http://msdn.microsoft.com/en-us/library/bb549422.aspx) 또는 일부 람다와 비교기를 사용하여 OrderBy 방법을 사용할 수 있습니다. (대개 내 비교를위한 조건부를 사용합니다.)

링크에 따라 참조 :

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

자세히보기 : http://msdn.microsoft.com/en-us/library/bb534966.aspx

+7

분명히 해시 세트를 정렬하지는 않지만 해시 세트의 정렬 된보기를 반환합니다. – CodesInChaos

+3

예, 사실입니다. HashSet에 포함 된 값은 정렬되지 않지만 정렬 된 뷰 (또는 복사)에서 액세스 할 수 있습니다. – ericosg

21

그렇지 않습니다. 정의에 따라 HashSet은 정렬되지 않습니다.

정렬 된 해시 세트를 원할 경우 SortedSet을 사용해야합니다. 이 메소드가 노출하는 메소드는 본질적으로 내용을 정렬하는 기능을 포함하여 HashSet에서 제공되는 메소드의 상위 세트입니다.

+2

SortedSet에는 HashSet을 사용할 때와 다른 고유 한 값이 포함되지 않지만 적절한 확장 메서드를 사용하여 Distinct 값을 생성 할 때 Distinct 값을로드 할 수 있습니다. – ericosg

+1

@ericosg 귀하의 의견을 이해할 수 없습니다. – CodesInChaos

+1

나는 SortedSet에서 Distinct 값이 필요하다면 구분 된 뷰를 얻기 위해 .Distinct()를 호출해야한다는 것을 의미했다. 정렬 된 HashSet이 필요한 경우 .OrderBy()를 호출하여 정렬 된 뷰를 가져와야합니다. – ericosg

8

HashSet의 < 문자열 >는 디자인으로 분류되지 않습니다. 당신은 항목을 정렬하려면 (HashSet의 < 문자열 >는 IEnumerable을 < 문자열 >를 구현하므로) (~ 자주는 아니지만) 다음 있는 OrderBy LINQ 방법을 사용할 수 있습니다 번 : hs.OrderBy (S =>들); 당신은 당신이 SortedDictionary 클래스를 사용할 수 있습니다 정렬 HashSet의이 필요하면

은 - 단지 TValue 일반적인 매개 변수에 대한 몇 가지 더미 유형 (즉 부울)를 사용합니다.

SortedSet 클래스는 .NET 3.5에서 사용할 수 없습니다.