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#
Trả lời
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.
Có thể bạn sẽ phải sử dụng Danh sách.
Đ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.
Đ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.
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);
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
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
- 1. Làm cách nào để chèn nhiều phần tử vào một phần tử thông qua nối thêm trong vòng lặp for?
- 2. Làm cách nào để chèn phần tử trực tiếp sau phần tử khác với XMLStarlet?
- 3. Làm cách nào để chèn văn bản bên trong vào phần tử xml trống?
- 4. Làm cách nào để chèn phần tử vào chỉ mục đầu tiên trong từ điển?
- 5. Làm thế nào để chèn các phần tử vào một vector?
- 6. Làm cách nào để thêm các phần tử vào ProgramElementCollection?
- 7. Làm thế nào để chèn một phần tử mới vào giữa tất cả các phần tử của một mảng Ruby?
- 8. Cách chèn các sự kiện chuột tổng hợp vào hàng đợi đầu vào X11
- 9. Làm cách nào để chèn một phần tử vào XML bằng LINQ?
- 10. MATLAB: chèn phần tử sau phần tử?
- 11. Làm cách nào để chèn phần tử HTML vào thanh tra Google Chrome?
- 12. Làm cách nào để chèn 100000 hàng vào MSSQL?
- 13. Làm cách nào để chèn phần tử trùng lặp vào vectơ?
- 14. Chèn các phần tử vào Binary Min Heaps
- 15. Cách chèn phần tử vào danh sách nội bộ MongoDB?
- 16. Xóa phần tử đuôi của hàng đợi ưu tiên
- 17. Cách chèn phần tử vào danh sách cuối cùng?
- 18. Cách chèn làm phần tử đầu tiên trong từ điển?
- 19. Lấy chỉ mục của phần tử bên trong hàng đợi C#
- 20. Làm cách nào để có thể chèn các phần tử <DependentUpon> vào tệp csproj mục tiêu
- 21. Làm cách nào để chèn dấu phẩy giữa mỗi phần tử trong lệnh dán trong R?
- 22. Chèn phần tử div làm cha mẹ
- 23. Tôi làm cách nào để đặt nhiều phần tử canvas vào một phần tử canvas?
- 24. Trình điều khiển Web Selenium đợi nhấp vào phần tử?
- 25. Làm cách nào để chèn nhiều hàng vào bảng MySQL và trả về các ID mới?
- 26. OCaml chèn một phần tử vào danh sách
- 27. C# Luồng và Hàng đợi
- 28. Làm cách nào để tạo các phần tử tùy thuộc vào dữ liệu trong D3?
- 29. Hàng đợi Đầy đủ, Chiều sâu của Hàng đợi Chặn, làm rõ cần thiết
- 30. Chèn tiện ích GWT vào phần tử div
...đừ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 :) –