C #에서 HashSet을 사용하는 방법

HashSet은 빠른 조회 및 고성능 집합 작업을 제공하는 정렬되지 않은 고유 한 요소의 최적화 된 모음입니다. HashSet 클래스는 .NET 3.5에서 처음 도입되었으며 System.Collection.Generic 네임 스페이스의 일부입니다. 이 기사에서는 C #에서 HashSet으로 작업하는 방법에 대해 설명합니다.

이 문서에 제공된 코드 예제를 사용하려면 시스템에 Visual Studio 2019가 설치되어 있어야합니다. 아직 복사본이없는 경우 여기에서 Visual Studio 2019를 다운로드 할 수 있습니다.

Visual Studio에서 .NET Core 콘솔 애플리케이션 프로젝트 만들기

먼저 Visual Studio에서 .NET Core 콘솔 애플리케이션 프로젝트를 만들어 보겠습니다. Visual Studio 2019가 시스템에 설치되어 있다고 가정하고 아래에 설명 된 단계에 따라 Visual Studio에서 새 .NET Core 콘솔 애플리케이션 프로젝트를 만듭니다.

  1. Visual Studio IDE를 시작합니다.
  2. "새 프로젝트 만들기"를 클릭합니다.
  3. "새 프로젝트 만들기"창의 표시된 템플릿 목록에서 "콘솔 앱 (.NET Core)"을 선택합니다.
  4. 다음을 클릭하십시오.
  5. 다음에 표시된 "새 프로젝트 구성"창에서 새 프로젝트의 이름과 위치를 지정합니다.
  6. 생성을 클릭합니다.

그러면 Visual Studio 2019에서 새로운 .NET Core 콘솔 애플리케이션 프로젝트가 생성됩니다.이 문서의 후속 섹션에서는이 프로젝트를 사용하여 HashSet을 사용합니다.

HashSet이란 무엇입니까?

System.Collections.Generic 네임 스페이스와 관련된 HashSet 클래스로 표시되는 HashSet은 고유 한 요소의 정렬되지 않은 고성능 컬렉션입니다. 따라서 HashSet은 정렬되지 않으며 중복 요소를 포함하지 않습니다. HashSet은 또한 인덱스를 지원하지 않습니다. 열거 자만 사용할 수 있습니다. HashSet은 일반적으로 고유 한 데이터 집합과 관련된 고성능 작업에 사용됩니다.

HashSet 클래스는 아래와 같이 여러 인터페이스를 구현합니다.

공용 클래스 HashSet : System.Collections.Generic.ICollection,

System.Collections.Generic.IEnumerable,

System.Collections.Generic.IReadOnlyCollection,

System.Collections.Generic.ISet,

System.Runtime.Serialization.IDeserializationCallback,

System.Runtime.Serialization.ISerializable

HashSet에는 고유 한 요소 만 포함되어 있으므로 내부 구조가 더 빠른 검색을 위해 최적화됩니다. HashSet에 단일 null 값을 저장할 수 있습니다. 따라서 HashSet은 고유 한 요소가 포함 된 컬렉션을 원할 때 좋은 선택이며 컬렉션의 요소를 빠르게 검색 할 수 있습니다.

C #의 HashSet에서 항목 검색

HashSet에서 항목을 검색하려면 아래 제공된 코드 스 니펫에 표시된대로 Contains 메소드를 사용할 수 있습니다.

static void Main (string [] args)

        {

            HashSet hashSet = new HashSet ();

            hashSet.Add ( "A");

            hashSet.Add ( "B");

            hashSet.Add ( "C");

            hashSet.Add ( "D");

            if (hashSet.Contains ( "D"))

                Console.WriteLine ( "필요한 요소를 사용할 수 있습니다.");

            그밖에

                Console.WriteLine ( "필수 요소를 사용할 수 없습니다.");

            Console.ReadKey ();

        }

HashSet 요소는 항상 고유합니다.

HashSet에 중복 요소를 삽입하려고하면 단순히 무시되지만 런타임 예외는 발생하지 않습니다. 다음 코드 스 니펫은이를 보여줍니다.

static void Main (string [] args)

{

   HashSet hashSet = new HashSet ();

   hashSet.Add ( "A");

   hashSet.Add ( "B");

   hashSet.Add ( "C");

   hashSet.Add ( "D");

   hashSet.Add ( "D");

   Console.WriteLine ( "요소 수 : {0}", hashSet.Count);

   Console.ReadKey ();

}

프로그램을 실행하면 그림 1과 같이 출력됩니다.

이제 중복 요소가 제거되는 방법을 보여주는 다음 코드 스 니펫을 고려하십시오.

문자열 [] 도시 = 새 문자열 [] {

                "델리",

                "콜카타",

                "뉴욕",

                "런던",

                "도쿄",

                "워싱턴",

                "도쿄"

            };

            HashSet hashSet = new HashSet (cities);

            foreach (hashSet의 var city)

            {

                Console.WriteLine (도시);

            }

위의 프로그램을 실행하면 중복 된 도시 이름이 제거됩니다.

C #의 HashSet에서 요소 제거

HashSet에서 항목을 제거하려면 Remove 메서드를 호출해야합니다. Remove 메서드의 구문은 다음과 같습니다.

public bool Remove (T 항목);

컬렉션에서 항목이 발견되면 Remove 메서드는 HashSet에서 요소를 제거하고 성공하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

아래에 제공된 코드 스 니펫은 Remove 메서드를 사용하여 HashSet에서 항목을 제거하는 방법을 보여줍니다.

문자열 항목 = "D";

if (hashSet.Contains (항목))

{

   hashSet.Remove (항목);

}

HashSet에서 모든 항목을 제거하려면 Clear 메서드를 사용할 수 있습니다.

C #에서 HashSet 집합 작업 메서드 사용

HashSet에는 IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith 및 SymmetricExceptWith와 같은 집합 작업에 대한 여러 가지 중요한 메서드가 있습니다.

IsProperSubsetOf

IsProperSubsetOf 메서드는 HashSet 인스턴스가 컬렉션의 적절한 하위 집합인지 확인하는 데 사용됩니다. 이것은 아래 주어진 코드 스 니펫에 설명되어 있습니다.

HashSet setA = new HashSet () { "A", "B", "C", "D"};

HashSet setB = new HashSet () { "A", "B", "C", "X"};

HashSet setC = new HashSet () { "A", "B", "C", "D", "E"};

if (setA.IsProperSubsetOf (setC))

   Console.WriteLine ( "setC는 setA의 모든 요소를 ​​포함합니다.");

if (! setA.IsProperSubsetOf (setB))

   Console.WriteLine ( "setB는 setA의 모든 요소를 ​​포함하지 않습니다.");

위의 프로그램을 실행하면 콘솔 창에 다음과 같은 출력이 나타납니다.

UnionWith

UnionWith 메서드는 아래 주어진 코드 스 니펫에 설명 된대로 집합 추가에 사용됩니다.

HashSet setA = new HashSet () { "A", "B", "C", "D", "E"};

HashSet setB = new HashSet () { "A", "B", "C", "X", "Y"};

setA.UnionWith (setB);

foreach (setA의 문자열 str)

{

   Console.WriteLine (str);

}

위의 코드를 실행하면 setB의 요소가 setA에 복사됩니다. 따라서 setA에는 이제 "A", "B", "C", "D", "E", "X"및 "Y"가 포함됩니다. 

IntersectWith 

IntersectWith 메서드는 두 HashSet의 교차점을 나타내는 데 사용됩니다. 이것을 이해하는 예가 있습니다.

HashSet setA = new HashSet () { "A", "B", "C", "D", "E"};

HashSet setB = new HashSet () { "A", "X", "C", "Y"};

setA.IntersectWith (setB);

foreach (setA의 문자열 str)

{

    Console.WriteLine (str);

}

위의 프로그램을 실행하면 두 HashSet에 공통된 요소 만 콘솔 창에 표시됩니다. 출력은 다음과 같습니다. 

ExceptWith

ExceptWith 메서드는 수학적 집합 빼기를 나타내며 O (n) 연산입니다. 두 개의 HashSets setA 및 setB가 있고 다음 명령문을 지정한다고 가정하십시오.

setA.ExceptWith (setB);

이것은 setB에없는 setA의 요소를 리턴합니다. 다른 예를 들어 이것을 이해합시다. 아래에 제공된 코드 스 니펫을 고려하십시오.

HashSet setA = new HashSet () { "A", "B", "C", "D", "E"};

HashSet setB = new HashSet () { "A", "X", "C", "Y"};

setA.ExceptWith (setB);

foreach (setA의 문자열 str)

{

   Console.WriteLine (str);

}

위의 프로그램을 실행하면 그림 5와 같이 "B", "D", "E"요소가 콘솔 창에 인쇄됩니다.

SymmetricExceptWith 

SymmetricExceptWith 메소드는 두 HashSet의 고유 요소, 즉 두 HashSet에 공통되지 않는 요소 만 포함하도록 HashSet를 수정하는 데 사용됩니다. 이를 설명하는 다음 코드 스 니펫을 고려하십시오.

HashSet setA = new HashSet () { "A", "B", "C", "D", "E"};

HashSet setB = new HashSet () { "A", "X", "C", "Y"};

setA.SymmetricExceptWith (setB);

foreach (setA의 문자열 str)

{

  Console.WriteLine (str);

}

위의 코드를 실행하면 setA 및 setB의 고유 요소 (즉, setA에는 있지만 setB에는없는 요소와 setB에는 있지만 setA에는없는 요소) 만 콘솔 창에 표시됩니다. 그림 6과 같이

배열의 요소에 액세스하기위한 평균 복잡도는 O (n)이고, 여기서 n은 배열의 요소 수를 나타내며, 복잡도는 HashSet의 특정 요소에 액세스하기위한 O (1)입니다. 따라서 HashSet은 빠른 검색 및 집합 작업 수행에 적합합니다. 특정 순서로 항목 모음을 저장하고 중복 항목도 포함하려는 경우 목록을 사용할 수 있습니다. 

C #에서 더 많은 작업을 수행하는 방법 :

  • C #에서 명명 및 선택적 매개 변수를 사용하는 방법
  • BenchmarkDotNet을 사용하여 C # 코드를 벤치마킹하는 방법
  • C #에서 유창한 인터페이스 및 메서드 체인을 사용하는 방법
  • C #에서 정적 메서드를 단위 테스트하는 방법
  • C #에서 God 개체를 리팩터링하는 방법
  • C #에서 ValueTask를 사용하는 방법
  • C에서 불변성을 사용하는 방법
  • C #에서 const, readonly 및 static을 사용하는 방법
  • C #에서 데이터 주석을 사용하는 방법
  • C # 8에서 GUID를 사용하는 방법
  • C #에서 추상 클래스와 인터페이스를 사용하는 경우
  • C #에서 AutoMapper를 사용하는 방법
  • C #에서 람다 식을 사용하는 방법
  • C #에서 Action, Func 및 Predicate 대리자를 사용하는 방법
  • C #에서 대리자를 사용하는 방법
  • C #에서 간단한 로거를 구현하는 방법
  • C #에서 특성을 사용하는 방법
  • C #에서 log4net으로 작업하는 방법
  • C #에서 리포지토리 디자인 패턴을 구현하는 방법
  • C #에서 리플렉션을 사용하는 방법
  • C #에서 filesystemwatcher로 작업하는 방법
  • C #에서 지연 초기화를 수행하는 방법
  • C #에서 MSMQ를 사용하는 방법
  • C #에서 확장 메서드를 사용하는 방법
  • C #에서 람다 식 사용 방법
  • C #에서 volatile 키워드를 사용하는 경우
  • C #에서 yield 키워드를 사용하는 방법
  • C #에서 다형성을 구현하는 방법
  • C #에서 자신 만의 작업 스케줄러를 빌드하는 방법
  • C #에서 RabbitMQ로 작업하는 방법
  • C #에서 튜플을 사용하는 방법
  • C #에서 가상 및 추상 메서드 탐색
  • C #에서 Dapper ORM을 사용하는 방법
  • C #에서 플라이 웨이트 디자인 패턴을 사용하는 방법