1

Datapagerにリンクされた2列のListViewがあります。ListViewは、特定のディレクトリ内の特定のタイプのすべてのファイルを一覧表示するため、データソースはFileInfoタイプのArrayListです。そのため、ArrayList.Sortメソッドで使用するComparerクラスを作成する必要がありました。

FileInfoComparer.vb:

Imports System.IO

Friend Class FileInfoDateComparer
 Implements IComparer

 Public Overridable Overloads Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
  Dim oX As FileInfo = CType(x, FileInfo)
  Dim oY As FileInfo = CType(y, FileInfo)
  Return oX.LastWriteTime.CompareTo(oY.LastWriteTime)
 End Function
End Class

Friend Class FileInfoNameComparer
 Implements IComparer

 Public Overridable Overloads Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
  Dim oX As FileInfo = CType(x, FileInfo)
  Dim oY As FileInfo = CType(y, FileInfo)
  Return oX.Name.CompareTo(oY.Name)
 End Function
End Class

GenerateSortedArray sub:

 Private Sub GenerateSortedArray(ByVal SortColumn As String, ByVal SortDirection As String)
  Dim dirInfo As New DirectoryInfo(Server.MapPath(AppSettings.Item("ContentDir")))
  Dim FileArrayList As New ArrayList(dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly))

  With FileArrayList
   .TrimToSize()
   Select Case SortColumn
    Case "Name"
     .Sort(New FileInfoNameComparer)
    Case Else
     .Sort(New FileInfoDateComparer)
   End Select
  End With

ListView_Sorting:

  Session("SortColumn") = e.SortExpression
  Session("SortDirection") = e.SortDirection

  Call GenerateSortedArray(e.SortExpression, DBNull.Value.ToString)

これはすべてうまく機能しますが、並べ替えを逆にする方法がわかりません。コードからわかるように、ソート方向を決定しましたが、それを使用してソートを逆にする方法がわかりません。

何かご意見は?

4

3 に答える 3

1

ComparerクラスにSortAscendingのような名前のブールメンバー変数が含まれていて、この値をコンストラクターで指定できるようにしますか。

たとえば、FileInfoDateComparerクラスは次の(テストされていない)コードのようになります。

Class FileInfoDateComparer
 Implements IComparer

  Private _SortAscending As Boolean = True

  Public Sub New(sortAscending As Boolean)
    _SortAscending = sortAscending
  End Sub

  ...
End Class

これで、CompareTo IF SortAscending = Falseを呼び出す前に、oX値とoY値を「入れ替える」だけで済みます。

Public Overridable Overloads Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
  Dim oX As FileInfo = CType(x, FileInfo)
  Dim oY As FileInfo = CType(y, FileInfo)

  If _SortAscending = False Then
    Dim temp As FileInfo = oX
    oX = oY
    oY = temp
  End If

  Return oX.LastWriteTime.CompareTo(oY.LastWriteTime)
End Function

それはやるべきだ!参考までに、上記のコードはカフから入力されたため、構文エラーがある可能性がありますが、概念は健全です。過去のプロジェクトで何度も使用しました。

最後のコメント-.NET3.5以降を使用している場合は、必要に応じて、独自のComparerクラスを作成する代わりに、LINQtoObjects構文を使用できます...

ハッピープログラミング...

于 2009-10-07T16:15:43.833 に答える
1

FileInfoDateComparer;を介してSortDirectoryを送信できます。「DESC」値を受け取ると、戻り値に-1を掛けることができます。

// sorry, C# version:

class FileInfoDateComparer
{
    private bool ascendingOrder = true;
    public FileInfoDateComparer(bool ascendingOrder)
    {
        this.sortOrder = sortOrder;
    }

    ... int Compare(object x, object y)
    {
        //...
        return
            oX.LastWriteTime.CompareTo(oY.LastWriteTime) * 
            (ascendingOrder ? 1: -1);
    }

}

フレームワークのバージョンについては何も言われていませんが、Reverse()Linq拡張メソッドの使用を検討してください。

于 2009-10-07T16:19:22.220 に答える
1

私は通常次のようなことをしました:

Friend Class FileInfoDateComparer
 Implements IComparer

    Private _sortOrder As System.Windows.Forms.SortOrder

    Public Sub New(ByVal sortOrder As System.Windows.Forms.SortOrder)
        _sortOrder = sortOrder
    End Sub

    Public Overridable Overloads Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
       Dim oX As FileInfo = CType(x, FileInfo)
       Dim oY As FileInfo = CType(y, FileInfo)
       Dim result As Integer = oX.LastWriteTime.CompareTo(oY.LastWriteTime)
       If _sortOrder = System.Windows.Forms.SortOrder.Descending Then
           ' we want the reverse sort order, so we "reverse" the result '
           result = result * -1
       End If
       Return result
 End Function
End Class

を使用したくない場合はSystem.Windows.Forms.SortOrder、独自のSortOrder列挙型をロールできます。コード内で値の意味が明確に示されるため、通常はブール値よりも列挙型を好みます。これら2つを比較してください。

Dim comparer As New FileInfoDateComparer(True)
Dim comparer As New FileInfoDateComparer(SortOrder.Descending)
于 2009-10-07T16:19:50.850 に答える