【问题标题】:FileInfoComparer not sorting correctly (on LastWriteTime)FileInfoComparer 未正确排序(在 LastWriteTime 上)
【发布时间】:2011-12-22 14:44:39
【问题描述】:

我有一个简单的 (ASP.NET) 网页,它列出了文件夹中特定类型的文件并将它们呈现在 ListView 中。

我尝试按 LastWriteTime 降序对它们进行排序,即按相反的日期顺序。然而,虽然排序过程确实改变了数组的顺序,但它并没有正确排序。例如,LastWriteTime 为 #6/3/2011 12:00:00 的一项位于列表顶部,但 LastWriteTime 为 #12/16/2011 12:00:00 的另一项在排序后位于列表的中间。

有什么想法吗?

代码:

        Dim dirInfo As New DirectoryInfo(Server.MapPath(AppSettings.Item("ContentDir")))
        Dim FileArrayList As New ArrayList(dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly))

        Dim SortDirections As New Dictionary(Of String, SqlClient.SortOrder)

        With FileArrayList
            .TrimToSize()
            .Sort(New FileInfoComparer(SqlClient.SortOrder.Descending, "LastWriteTime"))
        End With

FileInforComparer 类:

Imports System.IO
Imports System.Reflection


Public Class FileInfoComparer
    Implements IComparer

    Private _sortOrder As System.Data.SqlClient.SortOrder
    Private _sortColumn As String

    ''' <summary>
    ''' Constructs new Comparer object, using the supplied SortOrder and SortColumn parameters
    ''' </summary>
    ''' <param name="sortOrder">Defines the SortOrder for the comparison</param>
    ''' <param name="sortColumn">Defines which column is sorted</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal sortOrder As System.Data.SqlClient.SortOrder, ByVal sortColumn As String)
        _sortOrder = sortOrder
        _sortColumn = sortColumn
    End Sub


    ''' <summary>
    ''' Defines the Sorting mechanism for FileInfo objects
    ''' </summary>
    ''' <param name="x">First FileInfo object to compare</param>
    ''' <param name="y">Second FileInfo object to compare</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Overloads Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare

        Dim oX_PI As PropertyInfo = CType(x, FileInfo).GetType.GetProperty(_sortColumn)
        Dim oY_PI As PropertyInfo = CType(y, FileInfo).GetType.GetProperty(_sortColumn)
        Dim Result As Int16 = oX_PI.GetValue(x, Nothing).CompareTo(oY_PI.GetValue(x, Nothing))

        'If DESC then reverse the result
        If _sortOrder = SqlClient.SortOrder.Descending Then Result = Result * -1

        Return Result

    End Function
End Class

【问题讨论】:

  • FileInfoComparer 不是标准课程,我相信...
  • 是的,你是对的 - 匆忙发布!我已经更新了代码 sn-p。
  • 您使用的是什么版本的 .NET?如果您可以访问 LINQ,为什么不直接使用它的 Sort 方法?
  • 主要是我不懂LINQ!这是一两年前匆匆忙忙的事情,我只是想快速做出改变。我正在使用框架的 v4。
  • @cadrell0 - 虽然我想了解我当前方法的解决方案,但我对替代方案持开放态度。也许您可以指导我如何使用 LINQ?

标签: .net vb.net sorting directoryinfo


【解决方案1】:

LastWriteTime 可以作为字符串返回,它解释了排序顺序。这些值被排序为字符串,而不是 DateTime 对象。将字符串解析为日期时间,排序顺序应该是正确的。

【讨论】:

  • 你可能是对的,我没有按日期排序,但肯定不是按文本排序。我确实考虑过这一点,但老实说,我无法理解排序标准。不过,我会考虑修改我的代码以专门处理日期。
  • 据我所知oX_PI.GetValue(x, Nothing) 返回一个 Date 对象。 .ComppareTo 不能正确比较 Date 对象吗?
【解决方案2】:

这是一个使用 LINQ 的解决方案。这是用 C# 和 converted 编写到 VB 的,所以希望它可以工作。

Dim dirInfo = New DirectoryInfo(Server.MapPath(AppSettings.Item("ContentDir")))
Dim fileList = dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly).OrderByDescending(Function(f) f.LastWriteTime)

fileList 的类型将是 IEnumerable&lt;FileInfo&gt;。如果您需要它是一个可变列表,而不是使用ArrayList,我建议使用List&lt;FileInfo&gt;,这可以通过在结尾添加.ToList() 来完成,就像这样

Dim fileList = dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly).OrderByDescending(Function(f) f.LastWriteTime).ToList()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2015-04-14
    相关资源
    最近更新 更多