2017-06-22 18 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 "という名前の関数または類似の関数)にします。また、IEnumerable()のヒントは私にとって役に立ちました。 – Herb

関連する問題