2016-10-08 2 views
0

Я пытаюсь удалить элементы, если они содержат определенную строку. Это идея, которую я надеялся, что будет работать, но это не так:Как я могу удалить элемент из определенного индекса в очереди строки?

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 

Поскольку метод очереди не имеет «DEQUEUE с индексом» вариант как список будет, как я могу это сделать?

+0

Это не так, как работает «Очередь». Вместо этого вы захотите использовать «Список», если хотите манипулировать коллекцией при произвольных индексах. –

+0

Очередь постоянно проверяется работниками фона и довольно длинна. В основном, что я пытаюсь выполнить, пользователи могут деактивировать большие куски строк в очереди во время выполнения, в то время как фоновые рабочие обращаются к очереди. Если бы я должен был преобразовать очередь в список, отфильтруйте ее, а затем установите очередь, так как мне кажется, что это вызывает проблемы. Возможно, то, что я пытаюсь сделать, невозможно или вообще не является хорошей идеей. –

+1

@ ZachJohnson похоже, что вам нужна гибридная коллекция, такая особенная реализация не существует в рамках, но вы можете легко реализовать ее самостоятельно. Самый простой способ (а не самый чистый) - наследовать Очередь , а при данных очередей вы также добавляете их в индексируемую коллекцию и создаете перегрузку метода Dequeue ... –

ответ

1

Один из способов реализации было бы обернуть Queue(Of T) и воссоздать его, когда элемент получает «из очереди» с середины:

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 

Это самый простой реализации, хотя это не является наиболее эффективным, как мы воссоздавая Queue при каждом звонке до Dequeue(Integer). Но если это необычно, и очередь не массивная, все должно быть хорошо.

Лучшим способом было бы полностью переопределить Queue и использовать List вместо массива в качестве базового типа.