字典列表到多维数组

时间:2018-01-12 18:32:29

标签: .net vb.net dictionary multidimensional-array

我正在尝试将文件和路径列表传递给仅接受String(,)的第三方方法。此选择可能因用户选择而异。

我认为以下代表2D数组,保存文件的路径和名称。

myFiles As New List(Of Dictionary(Of String, String))()

但是当我必须将它传递给方法时,例如

ProcessFiles(ByVal Attachments(,) As String)

使用

 ProcessFiles(myFiles.ToArray())

我收到错误

  

“字典的值(字符串,字符串)()不能转换为   字符串()因为数组类型具有不同的数字   尺寸。

如何定义我的List以代表数组?

阵列期待

的布局
(0,0) --> "\\location\Of\File"
(0,1) --> "filename"
(1,0) --> "\\location\Of\File2"
(1,1) --> "filename2"

2 个答案:

答案 0 :(得分:1)

这是一个相对简单的解决方案(基本上是Plutonix建议的)假设每个字典只有1个值,字典键是路径,值是名称:

    ' temporary dictionary for loop iteration
    Dim currentDict As Dictionary(Of String, String)
    ' assuming each dictionary only has 1 path/name entry, set up 2D string array
    Dim myFileArray(,) As String = New String(myFiles.Count - 1, 1) {}

    ' assuming the dictionary key is the path and the dictionary value is the name, 
    ' iterate through myFiles and extract key/value into 2D array
    For i = 0 To myFiles.Count - 1
        currentDict = myFiles(i)
        myFileArray(i, 0) = currentDict.Keys(0)
        myFileArray(i, 1) = currentDict.Values(1)
    Next

    ProcessFiles(myFileArray)

我玩了一些LINQ查询,但是.ToArray产生锯齿状数组(与多维数组不同),所以如果你绝对需要2D数组,那么走这条路可能是不可行的。 p>

答案 1 :(得分:1)

接受的答案通常是处理它的方法。

但是,如果您有重复的目录(即同一目录中的两个文件),则无法使用目录作为字典的键,因为该键必须是唯一的。

List(Of ... KeyValuePairstructTuplecustom classexisting class )会绕过碰撞。

List(Of KeyValuePair)接近于词典,因为他们在枚举时会公开KeyValuePair,您只需用Dictionary(Of String, String)替换garthhh的答案中的List(Of KeyValuePair(String, String))避免碰撞。

具体来说,我认为System.IO.FileInfo可能是您案例的一个类,因为您正在处理文件。所以,使用List(Of System.IO.FileInfo) ...

Dim myFileListFileInfo As New List(Of System.IO.FileInfo) From {
    New FileInfo(System.IO.Path.Combine("\\location\Of\File", "filename")),
    New FileInfo(System.IO.Path.Combine("\\location\Of\File2", "filename2")),
    New FileInfo(System.IO.Path.Combine("\\location\Of\File3", "filename3"))
} ' initialize this way...
' ... or add like this
myFileListFileInfo.Add(New FileInfo(System.IO.Path.Combine("\\location\Of\File4", "filename4")))
Dim myFileArray(myFileListFileInfo.Count - 1, 1) As String
For i = 0 To myFileListFileInfo.Count - 1
    myFileArray(i, 0) = myFileListFileInfo(i).DirectoryName
    myFileArray(i, 1) = myFileListFileInfo(i).Name
Next

如果你真的只想要一个数组(,),也许它有点过分。正如我所说,你可以使用许多东西来代替类,元组等的FileInfo。