posted by 방랑군 2012. 1. 16. 21:46

Hashtable, HashSet, Dictionary 세 자료구조 모두 기본 알고리즘은 같다

해시코드를 사용하여 인덱스를 구하며 구조체와 배열에 데이터를 저장한다.


그럼 이 세놈의 차이점은 무엇일까? 간단히 정리해 보겠다. (내공이 부족하여 자세히는 못한다 ㅠㅠ)


Hashtable 과 Dictionary 는 둘 다 IDictionary 를 구현하고 있다.

다만 Hashtable 은 제너릭을 지원하지 않고, Dictionary<TKey, TValue> 는 제너릭을 지원한다.


HashSet<T> 은 제너릭은 지원하지만 키를 사용자에게 입력받지 않고

값을 이용하여 해시코드를 구한다.

이걸 어디에 쓸까 싶었지만, 중복값제거에 용의한듯하다.


참고 : http://chaoskcuf.com/191

[C#] 파일에서 중복을 제거하는 방법

 

 http://chaoskcuf.com/entry/C-파일명이-중복일-때-자동으로-이름을-생성하는-코드#comment3151

김시억님께서 위의 주소에 문의하신 내용입니다.

중복제거에관한건데요 텍스트화일을 불러들여 중복제거를 하려고합니다 
처음인데 막상시작하려하니 희안하게 로직이 잘 안떠오르는군요/// 
제가 1년좀 안되는데요 c#만 ....한번도 안해봐서 텍스트중복은;;; 
aa 
aa 
bb 
bb 
이렇게 있다고 할경우 저 텍스트화일을 중복제거해서 
aa 
bb 
이렇게만 결과물이 나오게하려면 어떻게 해야하나요? 
쉬운거 같으면서도 막상코딩하려니 로직이 감이 잘 안잡히네요 ㅠ.ㅠ 
답변부탁드립니다


가장 쉬운 방법은 .NET Framework 3.5에 HashSet을 사용하는 것입니다. 
HashSet은 .NET Framework 3.5에 처음 추가된 Generic Class로 어셈블리는 System.Core.dll이고, 
Namespace는 System.Collections.Generic 입니다. 
(주의 .NET Framework 3.5가 설치되어 있지 않으면 당연히 위의 클래스를 사용할 수 없습니다.)

Hash 특성상 내부의 hash function으로 현재 collection 안에 들어있는 값을 찾는데 걸리는 시간이 적고, 
Set 특성상 같은 내용을 중복으로 담고 있지 않아서 문의하신 내용에 가장 적합한 클래스입니다.

(그러나 Add 메소드는 상대적으로 다른 Collection보다 느릴 수 있기 때문에, 아주 긴 파일(수 MB가 넘는 파일)에는 적합하지 
않을 수 도 있습니다.)

해당 내용은 아래와 같이 구현할 수 있습니다.


Program.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;

namespace HashSetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HashSet<string> set = new HashSet<string>();

            using (TextReader reader = File.OpenText("test.txt"))
            {
                string line = reader.ReadLine();
                while (string.IsNullOrEmpty(line) == false)
                {
                    set.Add(line);
                    line = reader.ReadLine();
                }
            }

            foreach (string setItem in set)
            {
                Console.WriteLine(setItem);
            }
        }
    }
}

test.txt

aa
bb
aa
cc
aa
bb

Output

output


샘플 프로젝트 파일도 함께 첨부합니다.

'강좌 > C#' 카테고리의 다른 글

Cross-thread operation not valid  (0) 2012.01.17
Delegate  (0) 2012.01.17
Generic 컬렉션 - List, Dictionary, Queue, Stack  (0) 2012.01.16
DictionaryEntry 구조체  (0) 2012.01.16
[C#] internal, protected internal  (0) 2012.01.16