2017-06-22 62 views
0

我有字符串的隊列:如何正確地將字符串數組連接到隊列?

Public Class QueueClient 
    Private gaoFiles As New Queue(Of String) 

和在屬性呼叫的意圖的函數來連接字符串的陣列,以串的隊列:

Public Property AddFiles As String() 
     ... 
     Set(asValue As String()) 
      AddFilesToQueue(asValue) 
     End Set 
    End Property 

這是被調用的函數,其中我嘗試執行連接。

Private Sub AddFilesToQueue(asFiles() As String) 
     gaoFiles = CType(gaoFiles.Concat(asFiles), Queue(Of String)) 
    End Sub 
End Class 

這讓我的InvalidCastException(我有Option Strict On)。

我明白,

gaoAudioFiles.Concat(asFiles) 

試圖從一個字符串數組到Queue(Of String),它不這樣做,由於我設置的隱式轉換。

如何正確投射?

給我

回答

2

這並不是在所有你是怎麼想的工作。

Queue(Of T)類型的Concat()方法是從IEnumerable(OF T)繼承的,它使用的是執行,這意味着所有你得到的回覆是一個IEnumerable(Of T)。如果你可以將IEnumerable(Of T)轉換爲Queue(Of T),但這個效果沒問題(雖然效率不是很高),但是這個效果並不存在。取而代之的是,你必須入隊每個項目:

Private Sub AddFilesToQueue(asFiles() As String) 
    For Each file As String in asFiles 
     gaoFiles.Enqueue(file) 
    Next file 
End Sub 

這也是一種奇怪的以這種方式使用屬性。當你使用賦值語義時,最終用戶期望一個變量被完全替換爲一個新值。通過賦值語義追加是不正常的。更好地解決方法...但您可以使方法更有用,像這樣:

Public Sub AddFilesToQueue(asFiles As IEnumerable(Of String)) 
    For Each file As String in asFiles 
     gaoFiles.Enqueue(file) 
    Next file 
End Sub 

您仍然可以直接傳遞數組到該方法。您還可以傳遞List(Of String)或從IEnumerable繼承的任何其他序列(並且有很多)。

+0

感謝您的時間向我解釋這一點。 (事實上​​,我在檢測Concat方法之前有了循環。) - 同樣感謝你的建議,我將使這個方法成爲一個方法(並且「Getter」是一個名爲Files或類似的函數)。另外,IEnumerable()的提示對我很有用。 – Herb