2009-10-30 5 views
7

C#에서는 큐 컬렉션을 사용합니다. Enqueue 또는 Dequeue를 쉽게 할 수 있습니다. 자, 대기열의 중간이나 대기열의 시작 부분에 무언가를 삽입하고 싶습니다. 그런 일을하는 방법을 찾지 못합니다. 대체 컬렉션으로 무엇을 권하고 싶습니까?C#의 큐에 요소를 삽입하는 방법

+4

...말하지 마라, 당신은 슈퍼마켓에서 중간에 대기열에 들어가려고 노력하는 그 사람 중의 1 명인가? :) 내 요점은 큐의 전체 지점은 항목이 한쪽 끝에 입력하고 다른 쪽에서 나가는 것입니다. 자, 큐를 떠나는 사람들이 어떻게 구현 될지 알아내는 독자를위한 연습장으로 남겨 둘 것입니다. –

답변

26

큐는 정의에 따라 항목을 큐에 넣고 큐에서 제거 할 수있는 대상입니다. 중간에 삽입하려는 경우 Queue이 아닌 본격적인 목록 (아마도 LinkedList<T>)이 필요합니다.

내 말은, 슈퍼마켓의 대기열 중간에 너 자신을 "삽입"하려고하지 않는다는 것이다 (나는 희망한다). 그것은 같은 방식으로 여기에서 작동합니다.

1

아마도 목록을 사용해야합니다.

15

당신이 찾고있는 것은 LinkedList<T>입니다. 시작, 중간 (AddBefore 또는 AddAfter 사용) 또는 목록의 끝 부분에 추가 할 수 있습니다.

List<T>을 사용하는 것보다 이점이 많습니다. 그 이유는 RemoveFirst 또는 RemoveLast를 사용하여 큐 또는 스택을 더 자세히 모방 할 수 있기 때문입니다.

2

대기열의 포인트는 FIFO (선입 선출) 인터페이스 추상화를 제공하는 것입니다. 비 큐 방식으로 데이터 구조와 상호 작용할 수있게하려면 큐를 사용하지 마십시오.

4

대기열 중간에 항목을 추가 할 수있는 대기열 이외의 다른 기능을 사용할 수없는 위치에있는 경우이 페이지의 답변이 맞지만 (약간의 오버 헤드로) 대기열의 중간에 항목을 추가 할 수 있습니다. 그것이 완료되어야하는지의 여부는 다른 이야기입니다.

var myQueue = new Queue<string>(); 
myQueue.Enqueue("item 0"); 
myQueue.Enqueue("item 10"); 

var myList = myQueue.ToList(); 
myList.Insert(1, "item 5"); 

myQueue = new Queue<string>(myList); 
+1

유용한 기술. 새로운'Queue'를 생성하기 때문에, 이전 큐에 대한 참조를 가진 사람은 당신의 삽입을 보지 못할 것임을 명심하십시오! 이전 대기열이 "참조로"전달되고 다른 누구도 이전 대기열에 대한 참조를 "squirreled away"하면 때때로 OK입니다. 후자의 요구 사항은 문제입니다. 사용중인 클래스를 변경할 수 없으면 새로운 개체를 만들 수 있다는 보장이 없을 수도 있습니다. 이 경우 모든 항목을 임시 목록에 추가하고 삽입 한 다음 다시 대기열에 넣어야합니다. – ToolmakerSteve

0

대기열의 "중간"에 삽입하려는 경우 "우선 순위 대기열"을 찾고있을 수 있습니다.

불행히도 AFAIK는 .Net 클래스가 아닙니다. 적어도 지금은 개념 이름을 가지고 있습니다.

몇 가지 가능성 유용한 링크 &이 (폐쇄) Q를 참조하십시오 Priority queue in .Net


이 질문에서 인용 :

우선 순위 큐가 간단한 분류보다 더 많은 유연성을 제공하는 데이터 구조입니다, 왜냐하면 새로운 요소가 임의의 간격으로 시스템에 입력 할 수 있기 때문입니다. 우선 순위 대기열에 새 작업을 삽입하는 것보다 훨씬 비용 효율적으로 이러한 각 도착시 모든 것을 다시 정렬해야합니다.

  • 삽입 (Q, X) :

    기본 우선 순위 큐

    세 가지 기본 동작을 지원한다. 항목 x에 키 k가 있으면 우선 순위 큐 Q에 넣습니다.
  • 찾기 - 최소 (Q). 우선 순위 큐 에있는 다른 키보다 키 값이 작은 항목 에 대한 포인터를 반환하십시오.
  • 삭제 최소값 (Q). 키가 최소 인 우선 순위 큐 Q에서 항목을 제거하십시오.
관련 문제