2009-10-30 8 views
7

W języku C# używam kolekcji kolejki. Mogę łatwo zamawiać lub zamieniać w kolejkę. Okay, teraz chciałbym wstawić coś w środku kolejki lub na początku kolejki. Nie znajduję żadnej metody na zrobienie czegoś takiego. Co polecasz jako alternatywną kolekcję?Jak wstawić elementy do kolejki w C#

+4

...nie mów mi, że jesteś jednym z tych ludzi, którzy próbują wejść do kolejki pośrodku w supermarkecie? :) Chodzi mi o to, że cały punkt kolejki polega na tym, że przedmioty wchodzą na jeden koniec, a pozostawiają na innym. Teraz zostawię to jako ćwiczenie dla czytelnika, aby dowiedzieć się, jak można wyjść z kolejki. :) –

Odpowiedz

26

Kolejka, z definicji, jest czymś, do czego można tylko dodawać kolejki i usuwać kolejki. Jeśli chcesz wstawić w środku, chcesz pełną listę (prawdopodobnie LinkedList<T>), a nie Queue.

To znaczy, nie próbujcie "wkładać" siebie w kolejkę w supermarkecie (mam nadzieję); działa w ten sam sposób tutaj.

1

Prawdopodobnie będziesz musiał użyć Listy.

15

To, czego szukasz, to LinkedList<T>. Możesz dodać początek, środek (za pomocą AddBefore lub AddAfter) lub koniec listy.

Jest to korzystne w użyciu przy użyciu List<T>, ponieważ można następnie użyć opcji Usuń pierwsze lub Usuń, aby dokładniej naśladować kolejkę lub stos.

2

Punkt kolejki polega na dostarczeniu abstrakcji interfejsu FIFO (first-in-first-out). Jeśli chcesz mieć możliwość interakcji ze strukturą danych w sposób inny niż kolejkowy, nie używaj kolejki.

4

Podczas gdy odpowiedzi na tej stronie są poprawne, jeśli znajdziesz się w pozycji, w której nie możesz użyć czegoś innego niż kolejka, możesz (z odrobiną narzutów) dodać element do środka kolejki. To, czy powinno się to robić, czy nie, to inna historia.

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

Przydatna technika. Pamiętaj, że ponieważ tworzysz nową 'Queue', każda osoba z odniesieniem do starej kolejki nie zobaczy twojego wstawienia! Czasem jest OK, jeśli stara kolejka jest przekazywana "przez referencję" ORAZ nikt inny nie "odpycha" odniesienia do starej kolejki. To ostatnie wymaganie jest problemem: jeśli nie możesz zmienić używanej klasy, prawdopodobnie nie masz też gwarancji, że możesz zrobić nowy obiekt. W takim przypadku konieczne jest odjęcie wszystkich pozycji na listę tymczasową, wstawienie, a następnie ponowne ich dodanie. – ToolmakerSteve

0

Jeśli chcesz wstawić w „środku” kolejce, może być patrząc na „Kolejka priorytetowa”.

Niestety, to nie jest wbudowana klasa .Net, AFAIK. Ale przynajmniej teraz masz nazwę pojęcia, której szukasz.

Patrz to (zamknięte) Q & A dla niektórych potencjalnie przydatnych łączy:
Priority queue in .Net

Cytowanie stamtąd na pytanie

Kolejki priorytetowe są struktury danych, które zapewniają większą elastyczność niż proste sortowania ponieważ pozwalają one nowym elementom wchodzić do systemu w dowolnych odstępach czasu. O wiele bardziej opłacalne jest wstawianie nowego zadania do kolejki priorytetowej niż ponowne sortowanie wszystkiego po każdym takim przybyciu.

Podstawowym kolejka priorytetowa obsługuje trzy podstawowe operacje:

  • Insert (q, x). Biorąc pod uwagę element x z kluczem k, wstaw go do kolejki priorytetowej Q.
  • Znajdź-minimum (Q). Zwróć wskaźnik do pozycji , której wartość klucza jest mniejsza niż jakikolwiek inny klucz w kolejce priorytetu Q.
  • Delete-Minimum (Q). Usuń pozycję z kolejki priorytetowej Q, której klucz jest minimalny: