我有一个链接到Datapager的两列ListView。 ListView列出特定目录中特定类型的所有文件,因此数据源是FileInfo类型的ArrayList。因此,我必须创建一个Comparer类以在ArrayList.Sort方法中使用。
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)
所有这一切都很好,但是,我不知道如何扭转排序。从代码中可以看出,我已经确定了排序方向,但我不知道如何使用它来反转排序。
有什么想法吗?
答案 0 :(得分: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
那应该做到!仅供参考,以上代码是从袖口输入的,因此可能存在语法错误,但概念是合理的 - 我在过去的项目中多次使用它。
最后一条评论 - 如果您使用的是.NET 3.5+,则可以使用LINQ to Objects语法,而不必创建自己的Comparer类,如果您愿意的话......
快乐编程......
答案 1 :(得分: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扩展方法。
答案 2 :(得分: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枚举。我通常更喜欢枚举而不是布尔值,因为你会在你的代码中得到一个明确的声明值。比较这两个:
Dim comparer As New FileInfoDateComparer(True)
Dim comparer As New FileInfoDateComparer(SortOrder.Descending)