폴더의 특정 유형의 파일을 나열하고 ListView에서 렌더링하는 간단한 (ASP.NET) 웹 페이지가 있습니다.FileInfoComparer가 올바르게 정렬되지 않았습니다. (LastWriteTime에서)
나는 역순으로 내림차순으로 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 클래스 :
LastWriteTime이 정렬 순서를 설명하는 문자열로 반환 될 수 있습니다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
처럼, 다음 종료
.ToList()
를 추가하여 수행 할 수있는List<FileInfo>
를 사용하는 것이 좋습니다'FileInfoComparer'는 표준 아닙니다 클래스, 나는 믿는다 ... –예, 맞습니다 - 서둘러 게시! 코드 스 니펫을 업데이트했습니다. – CJM
어떤 버전의 .NET을 사용하고 있습니까? LINQ에 접근 할 수 있다면'Sort' 메소드를 사용하지 않는 것이 좋을까요? – cadrell0