【问题标题】:Order By file date in collection按文件收集日期排序
【发布时间】:2009-11-10 18:34:18
【问题描述】:

我认为 System.Collections.ObjectModel 没有任何排序或排序功能。

我有一个文件列表,我想按文件日期排序。

Dim list AS System.Collections.ObjectModel.ReadOnlyCollection(Of String)
list = My.Computer.FileSystem.GetFiles("C:\SearchFolder" _ 
    , FileIO.SearchOption.SearchByTopLevelOnly _
    , "TheFileName*.txt")

Dim sTheLastFile AS String

sTheLastFile = list.Max()

这将返回最后一个文件,但基于文件名而不是日期。我想我需要补充 .OrderBy(... 就是拿不到那部分。

【问题讨论】:

    标签: vb.net .net-3.5


    【解决方案1】:
    using System.IO;
    
    public static void Main()
    {
        DirectoryInfo di = new DirectoryInfo("c:\\temp\\");
        FileSystemInfo[] files = di.GetFileSystemInfos("*.mp3");
        printFiles(files);
    
        Array.Sort(files, CompareFileByDate);
        printFiles(files);
    
    }
    
    public static int CompareFileByDate(FileSystemInfo f1, FileSystemInfo f2)
    {
        return DateTime.Compare(f1.LastWriteTime, f2.LastWriteTime);
    }
    
    public static void printFiles(FileSystemInfo[] files)
    {
        foreach(FileSystemInfo file in files)
        {
            Console.WriteLine(file.Name);
        }
        Console.WriteLine("********************************");
    }
    

    看看这是否对你有帮助。

    我使用了LastWriteTime 属性。您可以选择适合您的(CreationTimeLastAccessTime)。

    编辑:当然,这可以使用 c# 3.0 转换为更紧凑的语法并支持 lambda 表达式。

    编辑2:

    from file in new DirectoryInfo(@"c:\temp\").GetFileSystemInfos("*.mp3")
    orderby file.LastWriteTime
    select file
    

    EDIT3:上述c#代码的vb.net版本

    from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _
    order by file.LastWriteTime _
    select file
    

    EDIT4:这是您要找的吗?
    这会给你最大。所有 *.mp3 文件的 LastWriteTime 日期。

    (from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _
    order by file.LastWriteTime descending _
    select file.LastWriteTime).Take(1)
    

    (from file in new DirectoryInfo("c:\temp\").GetFileSystemInfos("*.mp3") _
    select file.LastWriteTime).Max()
    

    【讨论】:

    • 我如何通过 file.LastWriteTime 将订单输入到我的代码中?
    • 上面的任何代码示例都没有帮助吗?您能否根据预期编辑您的问题,记住此答案中发布的代码示例?
    【解决方案2】:

    使用这个类,您可以使用适当的条件对文件进行排序(您必须为您需要的每个条件添加私有帮助程序类 ;-))

    
    Imports System.IO
    
    Class FilesTools
        Private Class HelperSortByLastWriteTimeAsc
            Implements IComparer(Of FileInfo)
    
            Public Function Compare(ByVal x As System.IO.FileInfo, _
                                    ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare
                Return Date.Compare(x.LastWriteTime, y.LastWriteTime)
            End Function
        End Class
    
        Private Class HelperSortByLastWriteTimeDesc
            Implements IComparer(Of FileInfo)
    
            Public Function Compare(ByVal x As System.IO.FileInfo, _
                                    ByVal y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare
                Return Date.Compare(y.LastWriteTime, x.LastWriteTime)
            End Function
        End Class
    
        Public Shared Function sortByLastTime() As IComparer(Of FileInfo)
            Return New HelperSortByLastWriteTimeAsc
        End Function
    
        Public Shared Function sortByLastTimeDesc() As IComparer(Of FileInfo)
            Return New HelperSortByLastWriteTimeDesc
        End Function
    
        Public Shared Function GetFilesSorted(ByVal path As String, _
                                              ByVal sort As IComparer(Of FileInfo)) As FileInfo()
            Dim info As FileInfo()
            info = New DirectoryInfo(path).GetFileSystemInfos()
    
            Array.Sort(Of FileInfo)(info, sort)
    
            Return info
        End Function
    
    End Class
    

    【讨论】:

      【解决方案3】:

      要完成此操作,请尝试以下操作...

      设置一个实现IComparer 接口的新类。这将用于执行比较。 IComparer 提供了一种自定义集合排序顺序的方法。请注意,下面的示例使用 LastWriteTime 作为比较的基础,但是可以将其更改为您认为合适的任何属性。

      Public Class clsCompareFileInfo
          Implements IComparer
          Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
              Dim File1 As FileInfo
              Dim File2 As FileInfo
      
              File1 = DirectCast(x, FileInfo)
              File2 = DirectCast(y, FileInfo)
      
              Compare = DateTime.Compare(File1.LastWriteTime, File2.LastWriteTime)
          End Function
      End Class
      

      然后,抓取文件集合并执行以下操作以对文件进行相应的排序。

       Dim dirinfo As DirectoryInfo = New DirectoryInfo("C:\SearchFolder")
              Dim allFiles() As FileInfo = dirinfo.GetFiles("TheFileName*.txt", SearchOption.TopDirectoryOnly)
              Array.Sort(allFiles, New clsCompareFileInfo)
              For Each fl As FileInfo In allFiles
                  MsgBox(fl.FullName.ToString())
              Next
      

      【讨论】:

      • 您的第一行正在创建错误:“System.Collections.ObjectModel.ReadOnlyCollection(Of String)”类型的值无法转换为“System.IO.FileInfo 的一维数组”跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2011-12-20
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多