代码之家  ›  专栏  ›  技术社区  ›  JeffO

按文件排序集合中的日期

  •  1
  • JeffO  · 技术社区  · 15 年前

    我认为,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()
    

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   shahkalpesh    15 年前
    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 财产。你可以选择适合你的( CreationTime LastAccessTime )

    编辑:当然,可以使用对lambda表达式的C 3.0&支持将其转换为更紧凑的语法。

    编辑2:

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

    edit3:vb.net以上C代码版本

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

    伊迪丝4:这就是你要找的吗?
    这将为您提供所有*.mp3文件的最后写入时间的最大日期。

    (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()
    
        2
  •  0
  •   Alejandro Díaz    15 年前

    使用这个类,您可以使用适当的条件来订购文件(您必须为所需的每个条件添加私有助手类;-)

    
    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
  •  0
  •   Jakkwylde    15 年前

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

    设置一个新类来实现 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