如何正确地将字符串数组连接到队列?

时间:2017-06-22 04:26:11

标签: arrays vb.net collections queue concatenation

我有一个字符串队列:

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)的隐式转换,由于我的设置,这不会完成。

如何正确投射?

给了我

1 个答案:

答案 0 :(得分:2)

这根本不起作用。

Concat()类型上的Queue(Of T)方法继承自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

以这种方式使用Property也有点奇怪。当您使用赋值语义时,最终用户希望变量完全替换为新值。通过赋值语义追加是不正常的。更好地解决方法...但你可以使这个方法更有用:

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继承的任何其他序列(并且有很多)。