2009-10-30 29 views
7

Trong C# Tôi sử dụng bộ sưu tập Hàng đợi. Tôi có thể dễ dàng Enqueue hoặc Dequeue. Được rồi, bây giờ tôi muốn chèn thứ gì đó vào giữa hàng đợi hoặc ở đầu hàng đợi. Tôi không tìm thấy phương pháp nào để làm điều đó. Bạn đề xuất gì làm bộ sưu tập thay thế?Làm cách nào để chèn các phần tử vào Hàng đợi trong C#

+4

...đừng nói với tôi, bạn là một trong những kẻ cố gắng bước vào hàng đợi ở giữa siêu thị? :) Điểm của tôi là toàn bộ điểm của một hàng đợi là các mục nhập nó vào một đầu và để lại ở một điểm khác. Bây giờ, tôi sẽ để nó như là một bài tập cho người đọc để tìm ra cách mọi người rời khỏi hàng đợi có thể được thực hiện :) –

Trả lời

26

Hàng đợi, theo định nghĩa, là thứ mà bạn chỉ có thể enqueue và dequeue mọi thứ. Nếu bạn muốn chèn ở giữa, sau đó bạn muốn có một danh sách chính thức (có lẽ là LinkedList<T>), không phải là Queue.

Ý tôi là, bạn sẽ không cố gắng "chèn" chính mình vào giữa hàng đợi trong siêu thị (tôi hy vọng); nó hoạt động theo cùng một cách ở đây.

1

Có thể bạn sẽ phải sử dụng Danh sách.

15

Điều bạn đang tìm kiếm là LinkedList<T>. Bạn có thể thêm vào đầu, giữa (sử dụng AddBefore hoặc AddAfter), hoặc kết thúc danh sách.

Điều này thuận lợi hơn khi sử dụng List<T> vì sau đó bạn có thể sử dụng RemoveFirst hoặc RemoveLast để nó bắt chước chặt chẽ hơn một Hàng đợi hoặc một Ngăn xếp.

2

Điểm của hàng đợi là cung cấp sự trừu tượng hóa giao diện FIFO (lần đầu tiên trong lần đầu tiên). Nếu bạn muốn có thể tương tác với cấu trúc dữ liệu của mình theo cách không xếp hàng, không sử dụng hàng đợi.

4

Trong khi câu trả lời trên trang này là chính xác nếu bạn thấy mình ở vị trí mà bạn không thể sử dụng thứ gì khác ngoài hàng đợi bạn có thể (với một chút chi phí) thêm một mục vào giữa hàng đợi. Cho dù nó nên được thực hiện hay không là một câu chuyện khác nhau.

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

Kỹ thuật hữu ích. Lưu ý rằng vì bạn đang tạo một 'Hàng đợi' mới, bất kỳ ai có tham chiếu đến Hàng đợi cũ sẽ không thấy chèn của bạn! Đôi khi là OK, nếu hàng đợi cũ được thông qua trong "bằng cách tham khảo" VÀ không ai khác có "squirreled đi" một tham chiếu đến hàng đợi cũ. Yêu cầu thứ hai là vấn đề: nếu bạn không thể thay đổi lớp bạn đang sử dụng, bạn có thể cũng không có bảo đảm rằng bạn được phép tạo một đối tượng mới. Trong trường hợp này, cần phải Dequeue tất cả các mục vào danh sách tạm thời của bạn, chèn, sau đó Enqueue tất cả chúng một lần nữa. – ToolmakerSteve

0

Nếu bạn muốn chèn vào "giữa" hàng đợi, bạn có thể đang tìm "Hàng đợi ưu tiên".

Thật không may, đó không phải là lớp built-in .Net, AFAIK. Nhưng ít nhất bây giờ bạn có một tên khái niệm, để tìm kiếm.

Xem này (khép kín) Q & A cho một số liên kết có thể hữu ích:
Priority queue in .Net

Trích dẫn từ câu hỏi đó:

hàng đợi ưu tiên là các cấu trúc dữ liệu cung cấp linh hoạt hơn sắp xếp đơn giản, bởi vì chúng cho phép các phần tử mới nhập vào một hệ thống theo các khoảng thời gian tùy ý. Chi phí hiệu quả hơn khi chèn một công việc mới vào hàng đợi ưu tiên hơn là sắp xếp lại mọi thứ trên mỗi lần đến đó.

Hàng đợi ưu tiên cơ bản hỗ trợ ba hoạt động chính:

  • Insert (Q, x). Cho một mục x bằng khóa k, chèn nó vào hàng đợi ưu tiên Q.
  • Tìm-Tối thiểu (Q). Trả lại con trỏ đến mục có giá trị khóa nhỏ hơn bất kỳ khóa nào khác trong hàng đợi ưu tiên Q.
  • Xóa-tối thiểu (Q). Xóa mục khỏi hàng đợi ưu tiên Q có khóa là tối thiểu
Các vấn đề liên quan