C#

[C#]HashSet 특정 값 가져오는 방법

DevStory 2022. 8. 21.

HashSet 특정 값 가져오는 방법

C#의 HashSet은 해시(Hash)를 기반으로 값을 관리하므로 인덱스를 사용하여 값을 가져올 수 없습니다.

 

다음 예제처럼 대괄호를 사용하여 값을 가져오는 소스 코드를 작성하면 컴파일 에러가 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    HashSet<int> hs = new HashSet<int>()
    {
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };
    Console.WriteLine("0번째 위치의 값: " + hs[0]);
  }
}

[에러 내용]

HashSet은 인덱스를 사용하지 않으므로 List처럼 인덱스를 사용하여 데이터 접근 및 데이터 정렬을 수행할 수 없습니다.

 

하지만, 해시 기반으로 값을 관리하므로 추가, 삭제 성능은 List보다 뛰어납니다.

 

이번 포스팅은 해시 기반으로 값을 관리하는 HashSet에서 값을 가져오는 몇 가지 방법을 소개합니다.


방법 1. HashSet의 TryGetValue 메서드

HashSet 클래스에서 제공하는 TryGetValue() 메서드를 사용하여 특정 값을 가져올 수 있습니다.

public bool TryGetValue (T equalValue, out T actualValue);

TryGetValue() 메서드의 첫 번째 매개변수에 특정 값을 전달하고 두 번째 매개변수에는 값을 반환받는 변수를 out 키워드와 함께 전달합니다.

 

특정 값이 존재하면 true를 반환하고 두 번째 매개변수로 사용된 변수에 특정 값을 할당합니다. 특정 값이 존재하지 않으면 false를 반환하고 두 번째 매개변수로 사용된 변수의 값을 변경하지 않습니다.

 

다음 예제는 int 타입의 HashSet에서 5와 100이 존재하는지 TryGetValue() 메서드로 확인 후 값을 가져옵니다.

class Program
{
  static void Main(string[] args)
  {
    HashSet<int> hs = new HashSet<int>()
    {
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };

    int result1 = 0;
    Console.WriteLine("5는 존재하는가? " + hs.TryGetValue(5, out result1));
    Console.WriteLine("result1: " + result1 + "\n");

    int result2 = 0;
    Console.WriteLine("100은 존재하는가? " + hs.TryGetValue(100, out result2));
    Console.WriteLine("result2: " + result2);
  }
}

[실행 결과]

5는 존재하는가? True
result1: 5

100은 존재하는가? False
result2: 0

HashSet에 5가 존재하므로 변수 result1의 값이 5로 변경되었습니다. 100은 존재하지 않으므로 TryGetValue() 메서드는 false를 반환했으며, 변수 result2의 값이 변경되지 않았습니다.


방법 2. LINQ의 FirstOrDefault 메서드

LINQ에서 제공하는 FirstOrDefault() 메서드는 배열, 컬렉션과 같은 데이터 집합에서 특정 조건을 만족하는 첫 번째 위치의 데이터를 가져옵니다.

 

만약, 조건에 맞는 값이 없는 경우 해당 타입의 Default 값을 반환합니다.

 

HashSet은 중복되는 값을 가지고 있지 않으므로 FirstOrDefault() 메서드를 유용하게 사용할 수 있습니다.

 

먼저, LINQ에서 제공하는 기능을 사용하기 위해 다음 네임스페이스를 추가합니다.

using System.Linq;

다음 예제는 FirstOrDefault() 메서드를 사용하여 특정 조건을 만족하는 값을 가져옵니다.

 

HashSet의 데이터가 int 타입이므로 특정 조건을 만족하는 값이 경우 int 타입의 Default 값인 0을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    HashSet<int> hs = new HashSet<int>()
    {
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };

    Console.WriteLine("hs.FirstOrDefault(num => num == 5): " +
        hs.FirstOrDefault(num => num == 5));

    Console.WriteLine("hs.FirstOrDefault(num => num == 100): " +
        hs.FirstOrDefault(num => num == 100));
  }
}

[실행 결과]

hs.FirstOrDefault(num => num == 5): 5
hs.FirstOrDefault(num => num == 100): 0

방법 3. LINQ의 Where 메서드

HashSet에서 특정 조건을 만족하는 모든 데이터를 가져오고 싶은 경우 LINQ의 Where() 메서드를 사용합니다.

 

다음 예제는 int 타입의 HashSet에서 5보다 작은 값을 List에 할당합니다.

class Program
{
  static void Main(string[] args)
  {
    HashSet<int> hs = new HashSet<int>()
    {
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };

    List<int> li = hs.Where(num => num < 5).ToList();

    Console.Write("HashSet에서 5보다 작은 데이터들: ");
    foreach(int num in li)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

HashSet에서 5보다 작은 데이터들: 1 2 3 4
반응형

댓글