본문 바로가기
프로그래밍/C#

C# Queue 기본 생성자로 초기화 하기

by bantomak 2023. 7. 26.

Queue를 List랑 동일하게 초기화 시키고 싶었다.

예상과는 다르게 에러가 발생.

List를 초기화하는 방식처럼 Queue도 초기화 될줄 알았는데 당연하게 될줄 알았던 부분이 작동하지 않았다.

 

List<int> L1 = new List<int> { 1, 2, 3 };

Queue<int> Q1 = new Queue<int> { 1, 2, 3 };  // error 발생

 

Add 메서드가 없어서 에러가 발생하는 상황

 

컬렉션 이니셜라이저(Collection initializers)

컬렉션 이니셜라이저를 사용하면 컬렉션 타입을 초기화할 때 하나 또는 그 이상의 요소 이니셜라이저를 지정해서 초기화 할 수 있다. 단 IEnumerable을 구현하고 적절한 시그니처가 있는 Add를 인스턴스 메서드 또는 확장 메서드로 포함해야 한다. 요소 이니셜라이저는 단순한 값, 식 또는 개체 이니셜라이저일 수 있다. 컬렉션 이니셜라이저를 사용하면 여러 호출을 지정할 필요가 없습니다. 컴파일러는 호출을 자동으로 추가합니다.

 

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

List<Cat> cats = new List<Cat>
{
    new Cat{ Name = "Sylvester", Age=8 },
    new Cat{ Name = "Whiskers", Age=2 },
    new Cat{ Name = "Sasha", Age=14 }
};

 

Queue 생성자 초기화 하기

queue는 Add 메서드를 포함하고 있지 않기 때문에 컬렉션 이니셜라이저를 사용할 수 없다.

초기화 할 때는 아래와 같이 초기화 해주자.

 

// Create a new queue from an integer array
Queue<int> myQueue = new Queue<int>(new int[] { 1, 2, 3, 4, 5 });

 

직접 Queue에 Add 메서드 추가하기

Add 메서드가 필요하다고 하니 확장 메서드를 이용해서 Queue에 Add 메서드를 추가해보자

 

public static class MyExtensions
{
    public static void Add<T>(this Queue<T> queue, T item)
    {
        queue.Enqueue(item);
    }
}
List<int> L1 = new List<int> { 1, 2, 3 };

Queue<int> Q1 = new Queue<int> { 1, 2, 3 };

이제 에러가 나지 않는다. Queue에도 컬렉션 이니셜라이저를 사용할 수 있게 되었다!

 

참조 사이트

 

Object and Collection Initializers - C# Programming Guide

Object initializers in C# assign values to accessible fields or properties of an object at creation after invoking a constructor.

learn.microsoft.com

댓글