예제가 포함된 C# 해시테이블

⚡ 스마트 요약

C#의 해시 테이블은 System.Collections 네임스페이스에 속하는 컬렉션으로, 데이터를 키-값 쌍으로 저장합니다. 각 고유한 키는 값에 매핑되며, 해당 키를 통해 저장된 값을 빠르게 조회할 수 있습니다.

  • 📚 키-값 쌍: 해시 테이블은 스택이나 배열 리스트처럼 단일 값만 저장하는 대신, 요소당 키와 해당 값, 두 개의 값을 저장합니다.
  • 요소 추가: Add 메서드는 키와 값을 함께 삽입하며, 해시 테이블 내의 모든 키는 고유해야 합니다.
  • 👀 ContainsKey 및 ContainsValue: 이 메서드들은 true 또는 false를 반환하므로 키 또는 값이 이미 존재하는지 여부를 테스트할 수 있습니다.
  • 🔁 읽기 값: ICollection의 Keys 속성이나 DictionaryEntry 루프를 사용하면 저장된 모든 값을 순서대로 읽을 수 있습니다.
  • 🛠️ 방법 및 속성: 제거, 지우기, 개수 세기, 키 및 값 기능은 해시 테이블의 내용을 관리하고 검사합니다.
  • 🤖 AI 지원: GitHub Copilot은 Hashtable 코드를 구성하는 기본 틀을 제공하는 반면, 최신 C# 및 ML.NET은 형식 안전성이 보장되는 키-값 데이터에 대해 일반적인 Dictionary를 선호합니다.

C# 해시테이블

C#의 해시테이블이란 무엇입니까?

해시 테이블은 키-값 항목을 저장하는 데 사용되는 특수 컬렉션입니다. 따라서 해시 테이블은 스택, 배열 목록, 큐와 같이 하나의 값만 저장하는 대신 2개의 값을 저장합니다. 이 2개의 값은 해시 테이블의 요소를 형성합니다.

다음은 해시 테이블의 값이 어떻게 보이는지에 대한 몇 가지 예입니다.

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

위에는 3개의 키 값 쌍이 있습니다. 각 요소의 키는 각각 001, 002, 003입니다. 각 키-값 쌍의 값은 “. NET", "C#" 및 "ASP.Net"입니다.

Hashtable 컬렉션에서 사용 가능한 작업을 더 자세히 살펴보겠습니다.

해시테이블 선언

Hashtable의 선언은 아래와 같습니다. Hashtable은 Hashtable Datatype의 도움으로 생성됩니다. "new" 키워드는 Hashtable의 객체를 생성하는 데 사용됩니다. 그런 다음 개체는 변수 ht에 할당됩니다.

Hashtable ht = new Hashtable()

해시테이블에 요소 추가

Add 메소드는 요소를 추가하는 데 사용됩니다. 변발. 명령문의 일반적인 구문은 다음과 같습니다.

HashTable.add("key","value")

예 1 :

해시 테이블의 각 요소는 2개의 값으로 구성됩니다. 하나는 키이고 다른 하나는 값입니다.

이제 이것이 코드 수준에서 작동하는 것을 살펴보겠습니다. 아래에 언급된 모든 코드는 콘솔 애플리케이션에 작성됩니다.

코드는 Program.cs 파일에 기록됩니다. 아래 프로그램에서는 위에서 언급한 방법을 어떻게 사용할 수 있는지 알아보기 위해 코드를 작성해 보겠습니다.

지금은 예제에서 해시테이블을 생성하고 해시테이블에 요소를 추가하고 그에 따라 표시하는 방법을 살펴보겠습니다.

C#의 해시테이블

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code 설명:-

  1. 먼저, “New”라는 키워드를 사용하여 Hashtable 데이터 유형을 사용하여 해시테이블 변수를 선언합니다. 정의하는 변수의 이름은 'ht'입니다.
  2. 그런 다음 Add 메서드를 사용하여 해시 테이블에 요소를 추가합니다. 해시테이블에 무언가를 추가할 때 키와 값 요소를 모두 추가해야 한다는 점을 기억하세요.
  3. 해시 테이블의 요소를 표시하는 직접적인 방법은 없습니다.
    • 해시테이블을 표시하려면 먼저 해시테이블에서 키 목록(001, 002, 003)을 가져와야 합니다.
    • 이는 ICollection 인터페이스를 통해 수행됩니다. 이는 해시테이블 컬렉션의 키를 저장하는 데 사용할 수 있는 특수 데이터 유형입니다. 그런 다음 해시테이블 컬렉션의 키를 'keys' 변수에 할당합니다.
  4. 다음으로 각 키 값에 대해 ht[k] 문을 사용하여 해시 테이블의 관련 값을 가져옵니다.

위 코드를 올바르게 입력하여 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.

출력:

C#의 해시테이블

해시 테이블에 사용할 수 있는 몇 가지 메서드를 더 살펴보겠습니다.

포함키

이 메서드는 Hashtable에 키가 있는지 확인하는 데 사용됩니다. 다음은 이 명령문의 일반적인 구문입니다. 키가 존재하면 명령문은 true를 반환하고, 그렇지 않으면 false 값을 반환합니다.

Hashtable.Containskey(key)

포함값

이 메서드는 Hashtable에 값이 있는지 확인하는 데 사용됩니다. 다음은 이 명령문의 일반적인 구문입니다. 해당 문은 값이 존재하면 true를 반환하고, 그렇지 않으면 false 값을 반환합니다.

Hashtable.ContainsValue(value)

예 2 :

우리의 코드를 변경해 봅시다 콘솔 응용 "Containskey" 및 "ContainsValue" 메서드를 사용하는 방법을 보여줍니다.

C#의 해시테이블

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code 설명:-

  1. 먼저, ContainsKey 메서드를 사용하여 키가 해시테이블에 있는지 확인합니다. 이 메서드는 키가 해시 테이블에 있으면 true를 반환합니다. 키가 해시테이블에 존재하므로 이 메서드는 true를 반환해야 합니다.
  2. 그런 다음 ContainsValue 메서드를 사용하여 값이 해시 테이블에 있는지 확인합니다. 값이 해시테이블에 존재하므로 이 메서드는 'true'를 반환합니다.

위 코드를 올바르게 입력하여 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.

출력:

C#의 해시테이블

출력에서 검색 중인 키와 값이 모두 해시 테이블에 있음을 명확하게 확인할 수 있습니다.

C# 해시테이블을 반복 처리하는 방법

위 예제들은 Keys 컬렉션을 통해 값을 읽어오지만, Hashtable은 더 깔끔한 방식으로 탐색할 수 있습니다. DictionaryEntry에 대한 foreach 루프를 사용하면 모든 요소의 키와 값을 한 번에 함께 얻을 수 있으며, 이는 Hashtable을 읽는 가장 일반적인 방법입니다.

단계 1) 해시 테이블을 생성하고 세 개의 키-값 쌍을 추가하세요.

단계 2) DictionaryEntry 변수를 사용하여 HashTable을 순회한 다음 각 항목의 Key 및 Value 속성을 읽습니다.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code 설명:-

  1. ht라는 이름의 해시테이블이 생성되고, Add 메서드를 사용하여 세 개의 키-값 쌍이 삽입됩니다.
  2. foreach 루프는 각 요소를 DictionaryEntry에 할당하며, 해당 DictionaryEntry의 Key 및 Value 속성은 쌍의 두 부분을 드러냅니다.

프로그램이 실행되면 각 키 옆에 해당 값을 출력합니다. 예를 들어 101과 같이 출력됩니다. Java해시 테이블은 삽입 순서를 유지하지 않기 때문에 키와 값 쌍이 추가된 순서와 다르게 나타날 수 있습니다. 키만 읽으려면 Keys 컬렉션을 순회하고, 값만 읽으려면 Values ​​컬렉션을 순회하세요.

C# 해시테이블 메서드 및 속성

Hashtable 클래스는 쌍을 추가하고 제거하는 것부터 멤버십을 확인하고 요소를 계산하는 것까지 거의 모든 작업을 처리할 수 있는 몇 가지 메서드와 속성을 제공합니다. 가장 유용한 멤버는 아래에 나열되어 있습니다.

회원 타입 기술설명
키와 값을 더합니다. 방법 새로운 키-값 쌍을 삽입합니다. 키는 고유해야 합니다.
제거(키) 방법 지정된 키와 일치하는 요소를 삭제합니다.
분명한() 방법 해시 테이블에서 모든 키-값 쌍을 제거합니다.
키(key)를 포함합니다 방법 주어진 키가 존재하면 true를 반환합니다.
값(값)을 포함합니다 방법 주어진 값이 존재하면 true를 반환합니다.
카운트 부동산 저장된 키-값 쌍의 개수를 가져옵니다.
부동산 모든 키의 컬렉션을 반환합니다.
마케팅은: 부동산 모든 값의 컬렉션을 반환합니다.

각 키가 해시되기 때문에 ContainsKey와 인덱서는 거의 상수 시간 안에 요소를 찾을 수 있으며, 이것이 해시 테이블이 빠른 조회에 매우 유용한 이유입니다.

C#에서 해시테이블과 딕셔너리의 차이점

해시 테이블과 딕셔너리는 모두 키-값 쌍을 저장하며, 둘 다 C#의 광범위한 범주에 속합니다. 컬렉션중요한 차이점은 타입 안정성이며, 이 차이점이 새로운 코드에서 어떤 방식을 선택해야 할지를 결정합니다.

  • 유형 안전: 해시테이블은 모든 키와 값을 객체로 저장하는 반면, 딕셔너리는 제네릭 타입이므로 컴파일러가 사용하는 타입을 확인합니다.
  • 네임 스페이스 : Hashtable은 System.Collections에 있고, Dictionary는 System.Collections.Generic에 있습니다.
  • Box노래 : 해시테이블은 int와 같은 값 형식을 박스 형태로 저장하지만, 제네릭 딕셔너리는 이러한 값 형식을 직접 저장하여 저장 비용을 절감합니다.
  • 성능 : 딕셔너리는 값을 읽을 때 객체에서 다시 형변환할 필요가 없기 때문에 일반적으로 더 빠릅니다.
  • 나사산 안전: Hashtable은 다음을 제공합니다. Sync하나의 작성자와 여러 읽기자를 위한 hronized 래퍼인 반면, 동시 실행 코드는 일반적으로 ConcurrentDictionary를 선택합니다.

새로운 프로젝트의 경우 일반적인 Dictionary를 사용하는 것이 권장되며, 일반적이지 않은 Hashtable은 주로 기존 코드에서 사용됩니다.

자주 묻는 질문

Remove 메서드는 지정된 키를 가진 요소를 삭제하고 Count 값을 1 감소시킵니다. 해당 키가 존재하지 않으면 아무 작업도 수행하지 않으므로, 키가 반드시 존재해야 하는 경우에는 ContainsKey 메서드를 먼저 호출해야 합니다.

아니요. 해시 테이블의 모든 키는 고유해야 합니다. 이미 존재하는 키로 Add 메서드를 호출하면 ArgumentException이 발생합니다. 하지만 동일한 값을 여러 개의 다른 키에 저장하는 것은 오류 없이 가능합니다.

Hashtable은 하나의 쓰기 스레드가 여러 읽기 스레드와 안전하게 연결되도록 지원합니다. 여러 쓰기 스레드가 필요한 경우 Hashtable로 감싸십시오.Synchronized를 사용하거나, 외부 잠금 없이 동시 읽기 및 쓰기를 처리하는 System.Collections.Concurrent의 ConcurrentDictionary를 사용하는 것이 좋습니다.

키를 사용하여 값을 조회하는 작업은 평균적으로 거의 상수 O(1) 시간 내에 실행됩니다. 이는 키를 해시하여 해당 버킷을 찾기 때문입니다. 심각한 해시 충돌이 발생하면 속도가 느려질 수 있지만, 키가 잘 분산되어 있는 경우에는 드뭅니다.

값은 null일 수 있지만 키는 null일 수 없습니다. Add 메서드나 인덱서에 null 키를 전달하면 ArgumentNullException 예외가 발생합니다. 또한 각 키는 고유해야 하며 저장되는 동안 변경되어서는 안 됩니다.

해시 테이블은 순서를 유지하지 않으므로 제자리 정렬이 불가능합니다. 해시 테이블의 키를 리스트나 어레이리스트에 복사한 후, 해당 리스트를 정렬하고 키를 사용하여 값을 읽어야 합니다. 정렬된 리스트(SortedList)는 항목의 순서를 자동으로 유지합니다.

네. GitHub Copilot은 짧은 주석이나 메서드 이름을 기반으로 Hashtable 선언, Add 호출, DictionaryEntry 루프를 작성해 줍니다. 또한 새로운 C# 코드에 권장되는 컬렉션인 제네릭 Dictionary를 제안하는 경우도 많습니다.

ML.NET 학습 데이터는 해시 테이블 대신 형식화된 컬렉션과 IDataView 파이프라인을 통해 흐릅니다. 하지만 해시 기반 키-값 맵은 여전히 ​​머신 러닝 모델 관련 기능 조회, 어휘 인코딩 및 캐싱을 지원합니다.

이 게시물을 요약하면 다음과 같습니다.