【问题标题】:How to sort array of FileInfo objects in descending order without LINQ如何在没有 LINQ 的情况下按降序对 FileInfo 对象数组进行排序
【发布时间】:2013-02-28 12:24:17
【问题描述】:

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

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

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

【问题讨论】:

  • OrderByDescendingWhere 是 LINQ 扩展方法,因此它们在 2.0 框架中不起作用。这两种方法中的哪一种你有问题?你试过什么?
  • 嗨史蒂文。是的,我应该摆脱 Linq。我更新了我的问题,您可以在其中看到仅按名称对 fileinfo 中的“文件”进行排序 - 降序仍然可以完成我的功能。

标签: arrays vb.net sorting .net-2.0


【解决方案1】:

要在不使用 LINQ 的情况下对数组进行排序,您可以使用 Array.Sort 共享方法。 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.FullNamey.FullName 进行比较。

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

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

使用Comparison(Of T)排序

如果您不需要在多个地方重复使用排序逻辑,或者像本例那样,比较逻辑非常简单,那么创建一个Comparison(Of T) 委托来指向一个 in-行匿名函数,像这样:

Array.Sort(Of FileInfo) _
    ( 
    files, 
    New Comparison(Of FileInfo) _
        ( 
        Function(f1 As FileInfo, f2 As FileInfo) f2.FullName.CompareTo(f1.FullName)
        )
    )

【讨论】:

  • .NET 2.0 中的匿名函数?
  • @Neolisk 是的。奇怪的是,当面向 .NET 2.0 框架时,实际上支持匿名函数。旧版本的 Visual Studio 不支持它,但只要您使用新版本的 Visual Studio,它就会正确处理它。无论如何,至少在 2012 年是这样。
  • 这很有趣。出于某种原因,我绝对确定它至少需要 .NET 3.0。刚刚在 VS 2008 和 2010 下测试,在面向 .NET 2.0 时都支持此功能。为信息 +1。
  • 非常感谢史蒂文。两种方式都按预期工作,内联和类!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多