2016-10-08 1 views
0

Ich versuche Elemente zu entfernen, wenn sie eine bestimmte Zeichenfolge enthalten. Das ist die Idee, die ich arbeiten würde hatte gehofft, aber nicht:Wie kann ich ein Element bei einem bestimmten Index in einer String-Warteschlange entfernen?

Dim baseUri As String = myuri.GetLeftPart(UriPartial.Authority) 
     For i = workerURLs.Count - 1 To 0 Step -1 
      If workerURLs(i).Contains(baseUri) Then 
       workerURLs.Dequeue(i) 
      End If 
     Next 

Da die Warteschlange Methode keine „Dequeue bei Index“ Option wie eine Liste würde wie kann ich das erreichen?

+0

So funktioniert eine 'Queue' nicht. Sie sollten stattdessen eine 'List' verwenden, wenn Sie die Sammlung bei beliebigen Indizes manipulieren möchten. –

+0

Die Warteschlange wird ständig von Hintergrundarbeitern überprüft und ist ziemlich lang. Grundsätzlich versuche ich, Benutzer in die Lage zu versetzen, große Teile der Warteschlangenstrings zur Laufzeit zu entfernen, während die Hintergrund-Workers auf die Warteschlange zugreifen. Wenn ich die Warteschlange in eine Liste umwandeln würde, filtere sie und setze dann die Warteschlange als diese Liste, was meiner Meinung nach Probleme verursachen würde. Vielleicht ist das, was ich zu erreichen versuche, nicht möglich oder gar keine gute Idee. –

+1

@ZachJohnson es klingt wie Sie brauchen eine hybride Sammlung, solche eigenartige Implementierung existiert nicht im Rahmen, aber Sie können es leicht selbst implementieren. Der einfachste Weg (nicht der sauberste) ist, die Queue zu erben. Wenn Daten in die Warteschlange gestellt werden, fügt man sie auch einer indexierbaren Sammlung hinzu und erzeugt eine Überladung der Dequeue-Methode ... –

Antwort

1

Eine Möglichkeit, es zu implementieren wäre es zu wickeln, ein Queue(Of T) und neu erstellen, wenn ein Element aus der Mitte „aus der Warteschlange entfernt“ bekommt:

Class IndexableQueue(Of T) 

    Private _queue As New Queue(Of T)() 

    Public Sub Enqueue(item As T) 
     _queue.Enqueue(item) 
    End Sub 

    Public Function Dequeue() As T 
     Return _queue.Dequeue() 
    End Function 

    Public Function Dequeue(index As Integer) As T 
     Dim list = _queue.ToList() 

     Dim item = list(index) 

     list.RemoveAt(index) 

     _queue = New Queue(Of T)(list) 

     Return item 
    End Function 

End Class 

Dies ist die einfachste Implementierung, obwohl es nicht die effizienteste ist, wie wir sind Erneutes Erstellen der Queue bei jedem Anruf an Dequeue(Integer). Aber wenn es ungewöhnlich ist und die Warteschlange nicht massiv ist, sollte es in Ordnung sein.

Der beste Weg wäre, die Queue vollständig neu zu implementieren und eine List anstelle eines Arrays als zugrunde liegenden Typ zu verwenden.

Verwandte Themen