FileInfoComparer неправильно сортирует (в LastWriteTime) - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть простая (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

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

LastWriteTime может быть возвращен в виде строки, которая объясняет порядок сортировки.значения сортируются как строки, а не объекты DateTime.проанализируйте строку в datetime, и порядок сортировки должен быть правильным.

1 голос
/ 23 декабря 2011

Вот решение, которое использует LINQ. Это было написано на C # и преобразовано в VB, так что, надеюсь, это работает.

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

Тип fileList будет IEnumerable<FileInfo>. Если вам нужен изменяемый список, а не ArrayList, я бы порекомендовал использовать List<FileInfo>, что можно сделать, добавив .ToList() в конец, например

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