私は、フォルダ内の特定の種類のファイルをリストし、ListViewでレンダリングする単純な(ASP.NET)Webページを持っています。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クラス:
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