[C#] 일반화 컬렉션

2023년 2월 23일 – (C# 프로그래밍) – (C#) 컬렉션

(C#) 컬렉션

컬렉션은 동일한 특성을 가진 데이터 컬렉션을 포함하는 데이터 구조입니다.

위의 설명에서 컬렉션을 배열로 변경만 하면 배열의 설명과 정의는 동일합니다.

좋아요!
배열도 .NET 프로그램입니다.

oneside-world.tistory.com

이전 포스트에서 컬렉션에 대해 썼습니다.

당시 도입된 컬렉션 클래스는 모두 객체 유형을 기반으로 했습니다.

모든 유형은 객체 유형을 상속하므로 객체 유형으로의 유형 변환이 가능합니다.

컬렉션은 이 지점으로 생성된 데이터 구조입니다.

이러한 컬렉션은 개체 유형을 기반으로 하기 때문에 본질적으로 성능 문제가 있습니다.

컬렉션의 항목에 액세스할 때마다 유형 변환이 발생하기 때문입니다.

일반화된 컬렉션은 이 문제를 해결합니다.

일반화 컬렉션은 일반화 기반으로 구축되기 때문에 컴파일 시간에 컬렉션이 사용하는 유형을 결정하고 불필요한 유형 변환을 방지합니다.

또한 잘못된 형식의 개체를 포함할 위험을 방지합니다.

그 중 대표적인 클래스 4개만 소개하겠습니다.

  • 목록
  • 대기줄
  • 스택
  • 사전

위의 4개는 이전 게시물에서 소개한 ArrayList, Queue, Stack 및 Hashtable의 일반화된 버전입니다.


1차 목록

제가 가장 좋아하고 가장 많이 사용하는 종류입니다.

계략클래스는 유형 매개변수로 입력된 유형 이외의 입력을 받아들이고 동일한 메서드를 사용한다는 점을 제외하면 일반화되지 않은 ArrayList 클래스처럼 작동합니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string() args)
    {
        List<int> numbers = new List<int>();

        numbers.Add(10);
        numbers.Add(20);
        numbers.Add(30);

        Console.WriteLine("Count: " + numbers.Count);

        foreach (int num in numbers)
        {
            Console.WriteLine(num);
        }

        numbers.RemoveAt(1);

        Console.WriteLine("Count: " + numbers.Count);

        foreach (int num in numbers)
        {
            Console.WriteLine(num);
        }
    }
}

위의 예제는 int 값만 저장하고 Add 메서드를 사용하여 요소를 추가하는 목록을 만듭니다.

Count 속성이 있는 항목 수와 foreach 루프가 있는 모든 항목을 인쇄합니다.

그런 다음 RemoveAt 메서드를 사용하여 인덱스 1의 요소를 삭제하고 다시 Count 속성과 foreach 루프를 사용하여 요소 및 모든 요소의 수를 인쇄합니다.


2. 대기열

유형 매개변수가 필수라는 점을 제외하면 일반화되지 않은 Queue 클래스와 같습니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string() args)
    {
        Queue<string> queue = new Queue<string>();

        queue.Enqueue("Apple");
        queue.Enqueue("Banana");
        queue.Enqueue("Cherry");

        Console.WriteLine("Count: " + queue.Count);

        foreach (string fruit in queue)
        {
            Console.WriteLine(fruit);
        }

        string item = queue.Dequeue();
        Console.WriteLine("Dequeued item: " + item);

        Console.WriteLine("Count: " + queue.Count);

        foreach (string fruit in queue)
        {
            Console.WriteLine(fruit);
        }
    }
}

위의 예제는 문자열 값을 저장할 큐를 생성하고 enqueue 메소드를 사용하여 항목을 추가합니다.

Count 속성이 있는 항목 수와 foreach 루프가 있는 모든 항목을 인쇄합니다.

그런 다음 추가된 첫 번째 요소는 Dequeue 메서드를 사용하여 제거되고 대기열에서 제거된 요소가 반환됩니다.

다시, Count 속성과 foreach 루프를 사용하여 항목 수와 모든 항목을 출력합니다.


3. 스택

형식 매개변수가 필요하다는 점을 제외하면 일반화되지 않은 Stack 클래스와 같습니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string() args)
    {
        Stack<int> stack = new Stack<int>();

        stack.Push(10);
        stack.Push(20);
        stack.Push(30);

        Console.WriteLine("Count: " + stack.Count);

        foreach (int value in stack)
        {
            Console.WriteLine(value);
        }

        int popValue = stack.Pop();
        Console.WriteLine("Popped item: " + popValue);

        Console.WriteLine("Count: " + stack.Count);

        foreach (int value in stack)
        {
            Console.WriteLine(value);
        }
    }
}

위의 예제는 int 값을 저장하는 스택을 생성하고 push 메서드를 사용하여 요소를 추가합니다.

Count 속성이 있는 항목 수와 foreach 루프가 있는 모든 항목을 인쇄합니다.

그런 다음 pop 메서드를 사용하여 마지막으로 추가된 항목을 제거하고 삽입된 항목을 덤프합니다.

다시, Count 속성과 foreach 루프를 사용하여 항목 수와 모든 항목을 출력합니다.


4. 사전

일반화되지 않은 Hashtable 클래스와 비슷하지만 두 개의 형식 매개변수를 사용한다는 점이 다릅니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string() args)
    {
        Dictionary<string, int> dictionary = new Dictionary<string, int>();

        dictionary.Add("One", 1);
        dictionary.Add("Two", 2);
        dictionary.Add("Three", 3);

        Console.WriteLine("Count: " + dictionary.Count);

        foreach (KeyValuePair<string, int> item in dictionary)
        {
            Console.WriteLine(item.Key + " = " + item.Value);
        }

        int value;
        if (dictionary.TryGetValue("One", out value))
        {
            Console.WriteLine("Value of One: " + value);
        }
        else
        {
            Console.WriteLine("Key not found");
        }

        dictionary.Remove("Two");

        Console.WriteLine("Count: " + dictionary.Count);

        foreach (KeyValuePair<string, int> item in dictionary)
        {
            Console.WriteLine(item.Key + " = " + item.Value);
        }
    }
}

위의 예에서는 문자열 키와 int 값을 저장하기 위해 사전을 만들고 Add 메서드를 사용하여 요소를 추가합니다.

Count 속성이 있는 항목 수와 foreach 루프가 있는 모든 항목을 인쇄합니다.

그런 다음 TryGetValue 메서드를 사용하여 키가 “One”인 요소의 값을 결정하고 출력합니다.

Remove 메서드를 사용하여 키 Two가 있는 요소를 제거합니다.

다시, Count 속성과 foreach 루프를 사용하여 항목 수와 모든 항목을 출력합니다.