- 딕셔너리와 매우 비슷하다. 차이점은 해시셋은 키만 있다는 점이다.
- 리스트와 딕셔너리를 쓰는 경우가 거의 90%이므로 거의 쓸 일이 없고, 특별할 때만 쓴다.
- 중복 데이터를 제거할 때 가장 쓰기 편하다.
1
| HashSet<T> <변수명> = new HastSet <T>(); //T는 저장할 키의 자료형
|
1 2
| HashSet<int> studentIDs = new HashSet <int> (); HastSet<string> studentNames = new HashSet <string> ();
|
해시셋에 요소 추가하기
1
| bool bSuccess = HastSet<T>.Add(T data);
|
- 해시셋에
없는 키
면 새 요소로 추가한 후 참을 반환
- 해시셋에
있는 키
면 거짓을 반환
1 2 3 4
| HashSet<int> studentIDs = new HashSet <int>(); bool bSuccess1 = studentIDs.Add(123); //참 bool bSuccess2 = studentIDs.Add(456); //참 bool bSuccess3 = studentIDs.Add(123); //거짓
|
이 요소가 해시셋에 있나요?
1
| bool bConatin = HastSet<T>.Contain(T data);
|
- 해시셋에
있는 키
면 참을 반환
- 해시셋에
없는 키
면 거짓을 반환
1 2 3
| HashSet<int> studentIDs = new HashSet <int>(); //{123, 456} bool bContain1 = studentIDs.Contains(123); //참 bool bContain2 = studentIDs.Contains(178); //거짓
|
해시셋 요소 삭제
1
| bool bRemoved = HastSet<T>.Remove(T data);
|
- 해시셋에
있는 키
면 요소를 삭제한 후 참을 반환
- 해시셋에
없는 키
면 거짓을 반환
1 2 3
| HashSet<int> studentIDs = new HashSet <int>(); //{123, 456} bool bRemoved1 = studentIDs.Remove(123); //참 bool bRemoved2 = studentIDs.Remove(178); //거짓
|
해시셋의 모든 요소 삭제
1 2
| HashSet<int> studentIDs = new HashSet <int>(); //{123, 456} studentID.Clear();
|
해시셋의 요소 가져오기
1
| bool bSuccess = HastSet<T>.TryGetValue(T Key, out T key);
|
- 해시셋에
있는 키
면 요소를 키에 연결된 요소를 out 매개변수에 대압하고 참을 반환
- 해시셋에
없는 키
면 거짓을 반환
1 2 3
| HashSet<int> studentIDs = new HashSet <int>(); //{123, 456} int id; bool bSuccess = studentIDs.TryGetValue(456, out iff)
|
컬렉션과 같이 쓰면 유용한 것들
리스트를 예로 들어, 순차적으로 요소를 탐색할 때 i가 왜 필요한지에 대한 의문이 생긴다. 또 부등호를 잘못 쓰는 것처럼 실수할 가능성도 있다.
1 2 3 4 5 6
| List<string> names = new List<string>(5);
for (int i = 0; i < names.Count; ++i) { Console.WriteLine($"Name: {names[i]}"); }
|
foreach
어떤 컬렉션이든 순회할 수 있는 방법이 있으면서 실수를 방지하는 좋은 방법이 바로 foreach
이다.
1
| foreach (T<변수명> in List<T>)
|
- foreach 문 안의 T는 리스트 선안할 때 사용한 자료형이다.
- <변수명>은 foreach 문 범위에서만 사용된다.
리스트와 foreach문
1 2 3 4 5 6
| List<string> names = new List<string>(4096);
foreach (string name in names) { Console.WriteLine(name); }
|
딕셔너리와 foreach문
1 2 3 4
| foreach (KeyValuePair<TKey, TValue> <변수명> in Dictionary<TKey, TValue>) {
}
|
- KeyValuePair의 TKey, TValue는 각각 딕셔너리를 선언할 때 사용한 키와 값의 자료형이다.
- <변수명>은 foreach 문 범위에서만 사용된다.
1 2 3 4 5 6
| Dictionary<string, string> students = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> score in students) { Console.WrtieLine($"key: {score.key}, value: {score.Value}"); }
|
배열([])과 foreach문
1
| foreach (T <변수명> in T[])
|
1 2 3 4 5 6
| float scores = {30.5f, 41.0f}
foreach (float score in scores) { Console.WriteLine(score); }
|
var
딕셔너리 foreach문이 작성해야하는 코드가 길고, 매번 keyValuePair를 써야한다는 문제점을 var가 해결해준다.
1 2 3 4 5 6
| Dictionary<string, string> students = new Dictionary<string, string>();
foreach (var score in students) { Console.WriteLine($"Key: {score.key}, value: {score.value}"); }
|
- 묵시적 자료형 : 컴파일러가 알아서 자료형을 추론해줌.
- 지역 변수에서만 사용 가능.
- 긴 자료형을 짧게 줄여준다.
- 반드시 선언과 동시에 대입해주어야 한다.
- 대입하는 값을 통해 명백하게 자료형을 알 수 있을 때만 사용한다.
References
실무 프로그래밍 입문(C#)