C++ 쟁이가 C#을 배워보자 - Set
이번 포스트는 드디어 지겨운(?) 기본 문법을 지나 C#에서 제공하는 컨테이너에 대해 시작해보고자 한다. 그 첫번째 대상은 집합 컨테이너인 Set.
집합 컨테이너 Set이 제공하는 기능은 간단히 특정 값이 있으면 마킹하는 용도라고 생각하면 된다. Set은 중복 데이터를 허용하지 않기 때문에이미 존재하는 값을 추가하려고 Add 메서드를 호출하면 false를 반환한다. 반환값으로 이미 데이터가 있는지 확인이 가능하다는 의미이다.
C#에서 제공하는 Set은 SortedSet과 HashSet 두 종류이다. 이름에서 알 수 있듯이 SortedSet은 정렬된 집합이고 HashSet은 해시 기반의 집합이다. 성능적인 면에서는 HashSet이 더 나으나 본인이 사용하고자 하는 목적에 맞게 골라서 사용하면 된다.
기본적인 선언 방법은 SortedSet<자료형> 같이 선언하여 사용하면 된다.
위 코드는 0~100 사이의 값 중 무작위로 Set에 넣어 그 값을 출력하는 예제이다. 만약 50이라는 값을 추가하는데 이미 추가되어 있는지 여부에 따라 작업을 다르게 하고 싶으면 아래와 같이 하면 된다.
위 코드는 iset 안에 있는 값이 짝수인 경우 삭제하여 홀수값만 남기는 코드이다.
Set 컨테이너가 제공하는 메서드 중 UnionWith 메서드는 다른 컨테이너의 데이터를 합칠 때 사용하는 메서드이다. 합칠 대상은 동일한 HashSet/SortedSet 뿐 아니라 동일한 Generic 타입을 가진 IEnumerable 객체이면 다 가능하다. 즉, 아래와 같이 Union이 가능하다는 의미이다.
단, HashSet<int>, List<double> 같이 타입이 다른 컨테이너는 통합이 불가능하다. (List 컨테이너는 추후 다른 포스트에서 더 다룰 예정이다.)Union(합집합) 외에도 집합 연산을 위한 Intersect(교집합), Except(차집합) 메서드가 있으니 필요한 경우 잘 활용하면 된다.
이 포스트에서는 기본적인 사용법과 메서드만 소개를 했으므로 MSDN에서 다른 메서드들이 뭐가 있는지 잘 살펴보고 활용하도록 하자
SortedSet 클래스
HashSet 클래스
집합 컨테이너 Set이 제공하는 기능은 간단히 특정 값이 있으면 마킹하는 용도라고 생각하면 된다. Set은 중복 데이터를 허용하지 않기 때문에이미 존재하는 값을 추가하려고 Add 메서드를 호출하면 false를 반환한다. 반환값으로 이미 데이터가 있는지 확인이 가능하다는 의미이다.
C#에서 제공하는 Set은 SortedSet과 HashSet 두 종류이다. 이름에서 알 수 있듯이 SortedSet은 정렬된 집합이고 HashSet은 해시 기반의 집합이다. 성능적인 면에서는 HashSet이 더 나으나 본인이 사용하고자 하는 목적에 맞게 골라서 사용하면 된다.
기본적인 선언 방법은 SortedSet<자료형> 같이 선언하여 사용하면 된다.
1. SortedSet
입력된 데이터를 정렬하여 보관하는 Set이다.SortedSet<int> iset = new SortedSet<int>(); Random rnd = new Random(); for (int i = 0; i < 50; i++) { iset.Add(rnd.Next(0, 100)); } foreach (var val in iset) { System.Console.WriteLine($"{val}"); }
위 코드는 0~100 사이의 값 중 무작위로 Set에 넣어 그 값을 출력하는 예제이다. 만약 50이라는 값을 추가하는데 이미 추가되어 있는지 여부에 따라 작업을 다르게 하고 싶으면 아래와 같이 하면 된다.
if (iset.Add(50) == true) { //50 추가 성공. 기존에 값이 없었다. } else { //50 추가 실패. 이미 값이 Set 안에 존재함 }이렇게 Set에 값이 추가된 이후에 특정 조건을 만족시키는 값만 삭제하고 싶은 경우 반환값은 bool이고 파라미터는 Generic에 지정한 타입과 동일한 변수를 받는 메서드를 제작하여 Set의 RemoveWhere 메서드에 넘겨주면 된다.
bool isEvenNum(int val) { return (val % 2 == 0); } ... iset.RemoveWhere(isEvenNum); ...
위 코드는 iset 안에 있는 값이 짝수인 경우 삭제하여 홀수값만 남기는 코드이다.
2. HashSet
HashSet도 내부 구조만 약간 다를 뿐 사용법은 SortedSet과 같다.HashSet<string> hset1 = new HashSet<string>(); hset1.Add("Captain America"); hset1.Add("Ironman"); hset1.Add("Hulk"); hset1.Add("Thor"); HashSet<string> hset2 = new HashSet<string>(); hset2.Add("Black Widow"); hset2.Add("Hawk Eye"); hset2.Add("Spiderman"); hset2.Add("Antman"); hset1.UnionWith(hset2); foreach (var val in hset1) { System.Console.WriteLine($"{val}"); }
Set 컨테이너가 제공하는 메서드 중 UnionWith 메서드는 다른 컨테이너의 데이터를 합칠 때 사용하는 메서드이다. 합칠 대상은 동일한 HashSet/SortedSet 뿐 아니라 동일한 Generic 타입을 가진 IEnumerable 객체이면 다 가능하다. 즉, 아래와 같이 Union이 가능하다는 의미이다.
List<string> list = new List<string>(); list.Add("Batman"); hset1.UnionWith(list);
단, HashSet<int>, List<double> 같이 타입이 다른 컨테이너는 통합이 불가능하다. (List 컨테이너는 추후 다른 포스트에서 더 다룰 예정이다.)Union(합집합) 외에도 집합 연산을 위한 Intersect(교집합), Except(차집합) 메서드가 있으니 필요한 경우 잘 활용하면 된다.
이 포스트에서는 기본적인 사용법과 메서드만 소개를 했으므로 MSDN에서 다른 메서드들이 뭐가 있는지 잘 살펴보고 활용하도록 하자
SortedSet
HashSet
댓글
댓글 쓰기