C#

[C#]HashSet 특정 값 삭제 방법

DevStory 2022. 8. 21.

HashSet 특정 값 삭제 방법

이번 포스팅은 HashSet 클래스에서 제공하는 메서드를 사용하여 HashSet의 데이터를 삭제할 수 있는 몇 가지 방법을 소개합니다. 


방법 1. HashSet의 Remove 메서드

HashSet 클래스에서 제공하는 Remove() 메서드에 특정 값을 전달하여 데이터를 삭제할 수 있습니다.

public bool Remove (T item);

정상적으로 삭제한 경우 true를 반환하고 특정 값이 HashSet에 존재하지 않으면 false를 반환합니다.


예제 1. 기본 타입

다음 예제는 int 타입의 HashSet에서 값이 10, 20, 50인 데이터를 삭제합니다.

class Program
{
  static void Main(string[] args)
  {
    HashSet<int> hs = new HashSet<int>()
    {
      10, 20, 30
    };

    Console.WriteLine("[삭제 전]");
    foreach (int item in hs)
    {
      Console.Write(item + " ");
    }

    Console.WriteLine("\n");
    Console.WriteLine("[삭제 중]");
    Console.WriteLine("10이 삭제되었습니까? " + hs.Remove(10));
    Console.WriteLine("20이 삭제되었습니까? " + hs.Remove(20));
    Console.WriteLine("50이 삭제되었습니까? " + hs.Remove(50));

    Console.WriteLine("\n[삭제 후]");
    foreach (int item in hs)
    {
      Console.Write(item + " ");
    }
  }
}

[실행 결과]

[삭제 전]
10 20 30

[삭제 중]
10이 삭제되었습니까? True
20이 삭제되었습니까? True
50이 삭제되었습니까? False

[삭제 후]
30

예제 2. 사용자가 정의한 클래스 타입

하지만, HashSet의 데이터가 사용자가 정의한 클래스 타입인 경우 참조 값을 비교하므로 정상적으로 삭제되지 않습니다.

 

다음 예제는 HashSet의 데이터 타입이 사용자가 정의한 클래스인 Person 타입이며, 데이터가 삭제되지 않은 것을 확인할 수 있습니다.

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

class Program
{
  static void Main(string[] args)
  {
    HashSet<Person> hs = new HashSet<Person>()
    {
      new Person(){Name="둘리", Age=20},
      new Person(){Name="또치", Age=30},
      new Person(){Name="마이콜", Age=40}
    };

    Console.WriteLine("[삭제 전]");
    foreach (Person item in hs)
    {
      Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age);
    }

    Console.WriteLine("\n[삭제 중]");
    Console.WriteLine("{Name=\"둘리\", Age=20}이 삭제되었습니까? " + 
        hs.Remove(new Person() { Name = "둘리", Age = 20 }));

    Console.WriteLine("{Name=\"또치\", Age=30}이 삭제되었습니까? " +
        hs.Remove(new Person() { Name = "또치", Age = 30 }));

    Console.WriteLine("{Name=\"마이콜\", Age=40}이 삭제되었습니까? " +
        hs.Remove(new Person() { Name = "마이콜", Age = 40 }));

    Console.WriteLine("\n[삭제 후]");
    foreach (Person item in hs)
    {
      Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age);
    }
  }
}

[실행 결과]

[삭제 전]
Name: 둘리, Age: 20
Name: 또치, Age: 30
Name: 마이콜, Age: 40

[삭제 중]
{Name="둘리", Age=20}이 삭제되었습니까? False
{Name="또치", Age=30}이 삭제되었습니까? False
{Name="마이콜", Age=40}이 삭제되었습니까? False

[삭제 후]
Name: 둘리, Age: 20
Name: 또치, Age: 30
Name: 마이콜, Age: 40

참조 값이 아닌 Person 클래스의 Name, Age 프로퍼티의 값을 비교하도록 Person 클래스에서 Equals() 메서드와 GetHashCode() 메서드를 재정의합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  
  public override bool Equals(object x)
  {
    return this.Name == ((Person)x).Name && this.Age == ((Person)x).Age;
  }

  public override int GetHashCode()
  {
    return this.Name.GetHashCode() ^ this.Age.GetHashCode();
  }
}

방법 2. HashSet의 RemoveWhere 메서드

HashSet 클래스에서 제공하는 RemoveWhere() 메서드는 특정 조건을 만족하는 데이터를 삭제합니다.

public int RemoveWhere (Predicate<T> match);

Remove() 메서드는 HashSet에서 제거된 데이터 수를 반환합니다.


예제 1. 기본 타입

다음 예제는 1부터 10까지 값을 가지는 int 타입의 HashSet에서 5보다 작은 값을 RemoveWhere() 메서드를 사용하여 삭제합니다.

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("[삭제 전]");
    foreach (int item in hs)
    {
      Console.Write(item + " ");
    }

    Console.WriteLine("\n");
    Console.WriteLine("[삭제 중]");
    Console.WriteLine(hs.RemoveWhere(item => item < 5) +
        "개의 데이터가 삭제되었습니다.");

    Console.WriteLine("\n[삭제 후]");
    foreach (int item in hs)
    {
      Console.Write(item + " ");
    }
  }
}

[실행 결과]

[삭제 전]
1 2 3 4 5 6 7 8 9 10

[삭제 중]
4개의 데이터가 삭제되었습니다.

[삭제 후]
5 6 7 8 9 10

예제 2. 사용자가 정의한 클래스 타입

HashSet의 데이터 타입이 사용자가 정의한 클래스 타입인 경우 Equals() 메서드와 GetHashCode() 메서드를 재정의 후 Remove() 메서드를 사용하여 데이터를 삭제했습니다.

 

RemoveWhere() 메서드를 사용한다면, Equals() 메서드와 GetHashCode() 메서드를 재정의하지 않고 HashSet의 데이터를 삭제할 수 있습니다.

 

다음 예제는 Person 타입의 HashSet에서 Age 프로퍼티의 값이 35보다 작은 데이터를 삭제합니다.

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

class Program
{
  static void Main(string[] args)
  {
    HashSet<Person> hs = new HashSet<Person>()
    {
      new Person(){Name="둘리", Age=20},
      new Person(){Name="또치", Age=30},
      new Person(){Name="마이콜", Age=40},
      new Person(){Name="고길동", Age=50}
    };

    Console.WriteLine("[삭제 전]");
    foreach (Person item in hs)
    {
      Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age);
    }

    Console.WriteLine("\n[삭제 중]");
    Console.WriteLine(hs.RemoveWhere(item => item.Age < 35) +
        "개의 데이터가 삭제되었습니다.");

    Console.WriteLine("\n[삭제 후]");
    foreach (Person item in hs)
    {
      Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age);
    }
  }
}

[실행 결과]

[삭제 전]
Name: 둘리, Age: 20
Name: 또치, Age: 30
Name: 마이콜, Age: 40
Name: 고길동, Age: 50

[삭제 중]
2개의 데이터가 삭제되었습니다.

[삭제 후]
Name: 마이콜, Age: 40
Name: 고길동, Age: 50

방법 3. HashSet의 ExceptWith 메서드

HashSet 클래스에서 제공하는 ExceptWith() 메서드를 사용하여 여러 값을 제거할 수 있습니다.

 

다음 예제는 1부터 10까지 값을 가지는 HashSet에서 ExceptWith() 메서드를 호출하며, ExceptWith() 메서드의 매개변수로 1부터 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
    };

    Console.WriteLine("ExceptWith() 메서드 호출 전 데이터 개수: " + hs.Count);
    
    hs.ExceptWith(new List<int>() { 1, 2, 3, 4, 5 });
    
    Console.WriteLine("ExceptWith() 메서드 호출 후 데이터 개수: " + hs.Count);
  }
}

[실행 결과]

ExceptWith() 메서드 호출 전 데이터 개수: 10
ExceptWith() 메서드 호출 후 데이터 개수: 5

방법 4. 모든 데이터 삭제

마지막으로 HashSet의 모든 데이터를 삭제하는 방법입니다.

 

HashSet 클래스에서 제공하는 Clear() 메서드를 호출합니다.

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("Clear() 메서드 호출 전 데이터 개수: " + hs.Count);
    
    hs.Clear();
    
    Console.WriteLine("Clear() 메서드 호출 후 데이터 개수: " + hs.Count);
  }
}

[실행 결과]

Clear() 메서드 호출 전 데이터 개수: 10
Clear() 메서드 호출 후 데이터 개수: 0
반응형

댓글