Wie erhalten Sie die ersten und letzten Elemente in einer Warteschlange?

7

Angenommen, ich habe eine rollende Sammlung von Werten, in der ich die Größe der Sammlung festlege, und jedes Mal, wenn ein neuer Wert hinzugefügt wird, werden alle alten Werte über diese angegebene Größe hinaus abgelegt. Offensichtlich (und ich habe dies getestet) ist die beste Art der Sammlung für dieses Verhalten eine Warteschlange:

%Vor%

Was aber, wenn ich den Unterschied zwischen den ersten und letzten Elementen in der Warteschlange berechnen möchte? Offensichtlich kann ich nicht auf die Artikel nach Index zugreifen. Aber das Umschalten von einer Warteschlange zu etwas, das IList implementiert, erscheint wie ein Overkill, genauso wie das Schreiben einer neuen Queue-ähnlichen Klasse. Im Moment habe ich:

%Vor%

Dieser Anruf bei ToArray() stört mich, aber eine bessere Alternative kommt nicht zu mir. Irgendwelche Vorschläge?

    
Dan Tao 20.08.2009, 19:01
quelle

5 Antworten

14

Eine Sache, die Sie tun könnten, ist eine temporäre Variable, die den Wert speichert, der gerade in die Warteschlange gestellt wurde, da dies der letzte Wert ist und auf die Variable zugegriffen werden kann, um diesen Wert zu erhalten.

    
murgatroid99 20.08.2009, 19:05
quelle
10

Scheint mir, wenn Sie schnellen Zugriff auf das erste Element in der Liste benötigen, dann verwenden Sie die falsche Datenstruktur. Wechseln Sie stattdessen eine LinkedList, die die Eigenschaften First und Last enthält.

Stellen Sie sicher, dass Sie der verknüpften Liste nur Elemente hinzufügen und entfernen, die AddLast und RemoveFirst verwenden, um die Warteschlangeneigenschaft beizubehalten. Um zu verhindern, dass Sie versehentlich die Queue-Eigenschaft verletzen, sollten Sie eine Wrapperklasse um die verknüpfte Liste erstellen und nur die Eigenschaften anzeigen, die Sie in Ihrer Warteschlange benötigen.

    
Juliet 20.08.2009 19:07
quelle
4
%Vor%

Bearbeiten: Offensichtlich sollte diese Basisklasse robuster sein, um beispielsweise die Last-Eigenschaft in einer leeren Warteschlange zu schützen. Aber das sollte für die Grundidee reichen.

    
xanadont 20.08.2009 19:09
quelle
2

Am besten wäre es, den letzten Wert von Queue im Auge zu behalten und dann die Funktion myQueue.Peek() zu verwenden, um das "erste" Element in der Liste zu sehen, ohne es zu entfernen.

>     
Adam Robinson 20.08.2009 19:06
quelle
1

Sie könnten eine Deque verwenden ( d doppelt - e nded Warteschlange ).

Ich glaube nicht, dass in System.Collections (.Generic) ein eingebaut ist, aber hier sind einige Informationen zur Datenstruktur. Wenn Sie so etwas implementiert haben, können Sie PeekLeft () und PeekRight () verwenden, um den ersten und letzten Wert zu erhalten.

Natürlich liegt es an Ihnen, ob die Implementierung Ihrer eigenen Deque dem Umgang mit der Unsexiness von ToArray () vorzuziehen ist oder nicht. :)

Ссылка

    
cakeforcerberus 20.08.2009 19:07
quelle

Tags und Links