对vb.net中的Directory.GetFiles的结果进行排序

问题描述:

我有一个目录包含所有tif formate文件,接近约30个文件,名称类似于B_1,B_2 ... upto B_15和F_1,F_2 ... upto F_1。 当我从getfile方法获取文件。对vb.net中的Directory.GetFiles的结果进行排序

Dim di As New IO.DirectoryInfo("c:\ABC\") 
    Dim diar1 As IO.FileInfo() = di.GetFiles() 

但同时retriving使用每个循环我得到像 B_1,B_10,B_11,B_12,B_13,B_14,B_15,B_2,B_3结果...高达B_9 同样喜欢 F_1,F_10 ,F_11,F_12,F_13,F_14,F_15,F_2,F_3 ...高达F_9

但问题是, 我想在像 B_1,B_2,B_3,B_4 ..... B_9,B_10模式, B_11 ...... B_15 然后 F_1,F_2,F_3,F_4 ..... F_9,F_10,F_11 ...... F_15

其实我的任务是从目录中获取所有文件并加入所有的tiff文件,如 F_1,B_1,F_2,B_2 ... F_9,B_9,F_10,B_10,F_11,B_11,... F_15,B_15

我已经实现了寄托都想尽一切办法参加TIFF和文件,但与B和F我正在存储各自的ArrayList但由于B_文件正在添加,B_10..so上这就是为什么我得到的问题开始......

PLZ帮我...

+0

[这个答案](http://stackoverflow.com/a/ 248613/3438854)看起来可能值得一试。 –

+0

如果最终结果相同,那么订单是否真的很重要? – StingyJack

+0

如果最终结果相同,那么也很好... – Saurabh

最简单的解决方案是创建一个返回排序键作为字符串,例如,您的情况的方法,这样的事情应该足够了:

Public Function GetFileInfoSortKey(fi As FileInfo) As String 
    Dim parts() As String = fi.Name.Split("_"c) 
    Dim sortKey As String = Nothing 
    If parts.Length = 2 Then 
     sortKey = parts(1).PadLeft(10) & parts(0) 
    Else 
     sortKey = fi.Name 
    End If 
    Return sortKey 
End Function 

然后,您可以使用该方法可以轻松地FileInfo对象的数组,这样的排序:

Array.Sort(diar1, Function(x, y) GetFileInfoSortKey(x).CompareTo(GetFileInfoSortKey(y))) 

如果你不关心保持它作为一个数组,你可能想使用通过LINQ提供OrderBy扩展方法:

Dim diar1 As IEnumerable(Of FileInfo) = di.GetFiles().OrderBy(Of String)(AddressOf GetFileInfoSortKey) 

另外,如果你使用Visual Studio的旧版本不支持lambda表达式,您可以通过肌酐做纳克一个独立的比较器方法,像这样:

Public Function FileInfoComparer(x As FileInfo, y As FileInfo) As Integer 
    Return GetFileInfoSortKey(x).CompareTo(GetFileInfoSortKey(y)) 
End Function 

然后,你可以使用比较器的方法调用Array.Sort,像这样:

Array.Sort(diar1, AddressOf FileInfoComparer) 
+0

Array.Sort方法我在函数“预期的表达式”下面收到错误,并且在GetFileInfoSortKey函数的下面出现错误“期望的语句结束” – Saurabh

+0

您必须使用旧版本的Visual不承认lambda表达的工作室。有什么理由不能升级到更新的版本?即使使用最新版本的Visual Studio,仍然可以在最早版本的.NET Framework中定位您的项目。但是,后面的编译器支持Lambda表达式,即使在定位早期的框架时也是如此。因此,如果您有更新版本的Visual Studio,则可以使用lambda表达式,即使在瞄准2.0时也是如此。 –

+0

@Saurabh如果您无法升级Visual Studio,我更新了我的答案,以显示如何在不使用lambda表达式的情况下执行相同的操作。 –