2011-12-22 4 views
0

私は、フォルダ内の特定の種類のファイルをリストし、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 
+1

のように、その後、終了する.ToList()を追加することによって行うことができますList<FileInfo>を、使用することをお勧めします 'FileInfoComparer'は標準ではありませんクラス、私は信じています... –

+0

ああ、あなたは正しい - 急いで掲示される!コードスニペットを更新しました。 – CJM

+0

使用している.NETのバージョンは何ですか? LINQにアクセスできない場合は、単に 'Sort'メソッドを使用しないでください。 – cadrell0

答えて

3

LastWriteTimeは、ソート順を説明した文字列として返されることがあります。値はDateTimeオブジェクトではなく文字列としてソートされます。文字列をdatetimeに解析し、ソート順が正しいはずです。

+0

あなたは私が日付でソートしていないのは間違いないかもしれませんが、確かにテキストでソートされていません。私はこれを考慮しましたが、正直言って、ソート基準を理解することはできません。それにもかかわらず、具体的に日付を処理するようにコードを修正する方法を見ていきます。 – CJM

+0

「oX_PI.GetValue(x、Nothing)」と言うことができる限り、Dateオブジェクトを返します。 .ComppareToはDateオブジェクトを正しく比較しませんか? – CJM

+0

日付が正しく比較されています –

1

ここにはLINQを使用するソリューションがあります。これはVBでC#とconvertedで書かれていますので、これがうまくいけばうまくいきます。

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を使用するよりも、AA変更可能なリストである必要がある場合、私はそう

Dim fileList = dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly).OrderByDescending(Function(f) f.LastWriteTime).ToList() 
関連する問題