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
posted by 방랑군 2012. 1. 16. 21:46

 Generic 형태의 컬렉션 구조를 사용하기

ArrayList

=

List<>

Hashtable

=

Dictionary<>

Queue

=

Queue<>

Stack

=

Stack<>

▼ Generic Collection

using System.Collections;

namespace ConsoleEx2
{
class Ex03_GenericCollection
{
static void Main(string[] args)
{
//ArrayList
ArrayList list1 = new ArrayList();
list1.Add(100); //int -> object
list1.Add(200); //업캐스팅
list1.Add(300); //박싱
int n1 = (int)list1[0]; // object -> int(다운,언박싱)

//ArrayList의 제네릭 버전 -> List<T>
//박싱, 언박싱이 일어나지 않는다
List<int> list2 = new List<int>(); //int[]
list2.Add(100); //int -> int
list2.Add(200);
list2.Add(300);

//언박싱이 일어나지 않는다
int n2 = list2[0];//int -> int

//아래와 같은 상황은 별로 권장x, 하나의 박스엔 같은 자료형의 집합만..
//제네릭 컬렉션에선 서로 다른 자료형을 저장할 순없다
//단지 박싱, 언박싱이 안일어난다는 차이밖에 없음
// 형변환이 일어나면 예상치 못한 에러 발생가능성이 높다!
list1.Add("홍길동");//x


//HashTable
Hashtable ht1 = new Hashtable();
ht1.Add("국어", 100);
ht1.Add("영어", 90);
ht1.Add("수학", 85);
int jumsu1 = (int)ht1["영어"];

//HashTable의 제네릭버전 -> Dictionary
//<키의 자료형, 값의 자료형>
Dictionary<string, int> ht2 = new Dictionary<string,int>();

//박싱, 언박싱 없음
ht2.Add("국어", 100);
ht2.Add("영어", 90);
ht2.Add("수학", 85);
int jumsu2 = ht2["영어"];


//Queue 제네릭
Queue<int> queue = new Queue<int>();
queue.Enqueue(100);
Console.WriteLine(queue.Dequeue() +100);

//Stack 제네릭
Stack<int> stack = new Stack<int>();
stack.Push(200);
Console.WriteLine(stack.Pop() + 100);

}
}
}

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

Cross-thread operation not valid  (0) 2012.01.17
Delegate  (0) 2012.01.17
Hashtable, HashSet<T>, Dictionary<TKey, TValue>  (0) 2012.01.16
DictionaryEntry 구조체  (0) 2012.01.16
[C#] internal, protected internal  (0) 2012.01.16
posted by 방랑군 2012. 1. 16. 21:43


MSDN 참고로 공부중.... 당체 먼말?? ㅋㅋ

 

DictionaryEntry

==> 설정하거나 검색할 수 있는 사전 키/값 쌍을 정의

http://msdn.microsoft.com/ko-kr/library/system.collections.dictionaryentry(v=VS.100).aspx

언어의 foreach 문에는 컬렉션의 각 요소 형식이 필요합니다.

IDictionary의 각 요소가 키/값 쌍이므로 요소 형식은 키의 형식도, 값의 형식도 아닙니다.

대신 요소 형식은 DictionaryEntry입니다.

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=KO-KR&k=k(SYSTEM.COLLECTIONS.IDICTIONARY)&rd=true

이곳으로 찾아가 보았다..

IDictionary 인터페이스는 키/값 쌍의 제네릭이 아닌 컬렉션에 대한 기본 인터페이스입니다



MSDN에 있는데 먼말인지는 알겟다..;;

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

Cross-thread operation not valid  (0) 2012.01.17
Delegate  (0) 2012.01.17
Hashtable, HashSet<T>, Dictionary<TKey, TValue>  (0) 2012.01.16
Generic 컬렉션 - List, Dictionary, Queue, Stack  (0) 2012.01.16
[C#] internal, protected internal  (0) 2012.01.16
posted by 방랑군 2012. 1. 16. 21:04

출처 :  http://blog.naver.com/khagaa?Redirect=Log&logNo=30096456055 


public, private, protected 이외에 internal이라는 접근 제어자가 있다.

액션스크립트에서도 본적이 있는데 거의 쓸 일이 없어서 써본적이 없는것 같다.


internal은 어셈블리를 기준으로 나뉜다고 한다. 어셈블리라는 것은 한 프로젝트가 뽑아내는 결과물이다.

exe가 됐던 dll 이 됐던 한 프로젝트는 결과물을 뽑아내고 이 결과물 내부에서는 public 처럼 접근이 가능하다고 한다.


접근이 불가능한 경우를 예로 들면 dll 프로젝트에서 internal로 선언된 클래스가 있다고 치면 다른 exe프로젝트에서 dll 을 참조하여

사용한다고 할 때 어셈블리가 다르기 때문에 internal 클래스에 접근 하지 못한다.


여기서 중요한 문제점 하나는 dll 을 참조하여 상속을 받으려 할 때이다.

internal로 선언된 클래스는 외부 프로젝트에서 접근을 할 수 없기 때문에 외부 프로젝트에서 dll 을 참조하여 상속 받는 경우에 대한 대비책이 필요할 수 있다.

그래서 나온것이 protected internal이다.

어셈블리가 다르더라도 상속을 받게 된다면 슈퍼클래스의 protected internal속성을 접근 가능하게 된다.

 

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

Cross-thread operation not valid  (0) 2012.01.17
Delegate  (0) 2012.01.17
Hashtable, HashSet<T>, Dictionary<TKey, TValue>  (0) 2012.01.16
Generic 컬렉션 - List, Dictionary, Queue, Stack  (0) 2012.01.16
DictionaryEntry 구조체  (0) 2012.01.16