【问题标题】:Sort a generic List对通用列表进行排序
【发布时间】:2012-09-20 18:32:46
【问题描述】:

我有一个包含CreationDate As Date 属性的MyObject 类。

获得按CreationDateList(Of MyObject)排序的最佳方法是什么?

更快、性能最好的方法。

【问题讨论】:

  • @hatchet 这是 C# 的问题,而不是 VB 语法,它在语法上很重要。

标签: .net vb.net linq generics sorting


【解决方案1】:

你可以使用 LINQ:

Dim sorted = unsorted.OrderBy(Function(x) x.CreationDate) _
                     .ToList()

编辑:如果您已经有了List(Of T),您可以使用带有自定义比较器的就地Sort 方法。那可能会更快。它可能不会。我怀疑这不太可能是性能上的显着差异,这是您应该关注的。

根据经验,我建议:

  • 找出什么是“足够”的表现
  • 以最易读的方式编写代码(很可能是 LINQ,而不是自定义比较器,IMO)
  • 测量该代码
  • 如果速度不够快足够,请尝试另一种方法,并对其进行测量。将性能差异与可读性/可维护性差异进行比较。

【讨论】:

  • 乔恩,这必须是某些东西的复制品。
  • @JohnSaunders:很有可能。当我需要一分钟来回答一个问题或四分钟才能找到一个非常好的副本时,我总是会被撕裂......
  • @JonSkeet:我希望你有我没有的一分钟 :-)
  • @serhio:说实话,我不知道。我怀疑就地排序和OrderBy 使用不同的排序算法——在某些情况下,有些算法会比其他算法更快。我强烈怀疑性能不会有显着的差异。
  • 使用List(Of T)的排序方法可能比LINQ快。
【解决方案2】:

列表有一个排序方法。它的一个重载允许指定一个比较

unsorted.Sort(Function(x, y) x.CreationDate.CompareTo(y.CreationDate))

【讨论】:

  • 不,我没有。我假设未排序的是List(Of MyObject)。这不是 LINQ!但是,分配错误。
  • +1 如果 OP 想要订购原始集合而不是创建新集合,这会更有效。
  • 我的智能感知与 VB 以及 C# 一起使用这个例子。无需明确指定类型。我正在使用 VS 2008。
【解决方案3】:

您可以实现IComparer 接口并定义它的Compare 方法来检查您的MyObject 对象的日期:

public class MyObjectComparer<T> : IComparer<T>
{
    public int Compare(MyObject firstObject, MyObject secondObject)
    {
        return firstObject.CreationDate.Compare(secondObject.CreationDate);
    }
}

注意:我假设您的 CreationDateDateTime 类型,但您可以根据需要实现比较功能。

然后根据您的比较器对您的列表进行排序:

myListObject.Sort(new MyObjectComparer<MyObject>());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多