3

我必须降级我的代码才能在不支持 LINQ 的 NET 2.0 上工作。目前,代码使用 LINQFileInfo按属性对对象数组进行排序,如下所示:FullName

    Dim files As FileInfo() = ' ...
    files = files.OrderByDescending(Function(x) x.FullName).ToArray()

如何在不使用OrderByDescendingLINQ 扩展方法的情况下在 2.0 .NET Framework 中执行相同类型的排序?

4

1 回答 1

4

要在没有 LINQ 的情况下对数组进行排序,可以使用Array.Sortshared 方法。If 有许多重载允许您自定义数组的排序方式。在这种情况下,我推荐的两个重载将是一个接受IComparer(Of T)对象的重载,或者一个接受Comparison(Of T)委托的重载。

排序使用IComparer(Of T)

IComparer(Of T)接口可用于创建包装排序逻辑的可重用类。您可以使用相同的类轻松地对任何数组或列表进行排序IComparer(Of T),因此在您需要在代码中的多个位置重复使用相同的排序逻辑的情况下,它通常更方便。首先,您需要创建实现接口的类,如下所示:

Public Class FileInfoDescendingByNameComparer
    Implements IComparer(Of FileInfo)

    Public Function Compare(x As FileInfo, y As FileInfo) As Integer Implements IComparer(Of FileInfo).Compare
        Return y.FullName.CompareTo(x.FullName)
    End Function
End Class

如您所见,我使用String类(FullName属性)中内置的默认比较逻辑来执行比较。它将按降序排序的原因是因为我是在比较y.FullNamex.FullName不是x.FullName比较y.FullName

FileInfo然后,您可以使用该类对对象数组进行排序,如下所示:

Array.Sort(Of FileInfo)(files, New FileInfoDescendingByNameComparer())

排序使用Comparison(Of T)

如果您不需要在多个地方重复使用排序逻辑,或者像这种情况下比较逻辑非常简单,创建一个Comparison(Of T)委托来指向一个内联匿名函数会更容易,就像这样:

Array.Sort(Of FileInfo) _
    ( 
    files, 
    New Comparison(Of FileInfo) _
        ( 
        Function(f1 As FileInfo, f2 As FileInfo) f2.FullName.CompareTo(f1.FullName)
        )
    )
于 2013-02-28T14:23:14.770 回答