【问题标题】:Smart sorting by release date and version按发布日期和版本进行智能排序
【发布时间】:2014-05-27 12:41:36
【问题描述】:

对于我们的一个内部工具,我们想为可执行文件添加一些智能排序。

我们以这个为例:

        var unsortedItems = new[]
        {
            new {ReleaseDate = DateTime.Parse("2009-01-01"), Version = new Version(3, 2, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2012-01-01"), Version = new Version(1, 3, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2009-02-01"), Version = new Version(3, 2, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2011-02-01"), Version = new Version(1, 3, 0, 0)},
            new {ReleaseDate = DateTime.Parse("2010-01-01"), Version = new Version(3, 4, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2011-03-01"), Version = new Version(3, 4, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2013-02-01"), Version = new Version(1, 6, 2, 0)},
        };

        var sortedItems = new[]
        {
            new {ReleaseDate = DateTime.Parse("2013-02-01"), Version = new Version(1, 6, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2012-01-01"), Version = new Version(1, 3, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2011-02-01"), Version = new Version(1, 3, 0, 0)},
            new {ReleaseDate = DateTime.Parse("2011-03-01"), Version = new Version(3, 4, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2010-01-01"), Version = new Version(3, 4, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2009-02-01"), Version = new Version(3, 2, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2009-01-01"), Version = new Version(3, 2, 1, 0)},
        };

但是,看看这个例子:

var unsortedItems = new[]
        {
            new {ReleaseDate = DateTime.Parse("2009-01-01"), Version = new Version(3, 2, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2009-03-01"), Version = new Version(6, 3, 1, 0)},
            new {ReleaseDate = DateTime.Parse("2009-02-01"), Version = new Version(3, 2, 2, 0)},
            new {ReleaseDate = DateTime.Parse("2014-01-01"), Version = new Version(3, 4, 1, 0)},
        };

// Note that the 2009-03-01 seems off compared to the rest (this is just a single case).

// One variant 
var sortedItems = new[]
            {
                new {ReleaseDate = DateTime.Parse("2014-01-01"), Version = new Version(3, 4, 1, 0)},
                new {ReleaseDate = DateTime.Parse("2009-03-01"), Version = new Version(6, 3, 1, 0)},
                new {ReleaseDate = DateTime.Parse("2009-02-01"), Version = new Version(3, 2, 2, 0)},
                new {ReleaseDate = DateTime.Parse("2009-01-01"), Version = new Version(3, 2, 1, 0)},
            };


// Or this is acceptable too since it's pretty much a rotten apple
var sortedItems = new[]
            {
                new {ReleaseDate = DateTime.Parse("2014-01-01"), Version = new Version(3, 4, 1, 0)},
                new {ReleaseDate = DateTime.Parse("2009-02-01"), Version = new Version(3, 2, 2, 0)},
                new {ReleaseDate = DateTime.Parse("2009-01-01"), Version = new Version(3, 2, 1, 0)},
                new {ReleaseDate = DateTime.Parse("2009-03-01"), Version = new Version(6, 3, 1, 0)},                
            };

问题是这样的,我们曾经按版本排序,但是当版本号急剧变化(变低)时,这并不总是可行的。我们也不能总是按发布日期排序,因为我们发现这不可靠(某些可执行文件的发布日期与版本不匹配)。所以我们想以某种方式将这些值组合成一个考虑到两者的排序。在上面的示例中,很明显版本控制在 2011 年左右切换到了较低的编号系统。我正在考虑做一个最小间隔(比如说 1 年)来按版本区分不同的组,然后按他们的版本排序,但我不完全确定这是否会导致对用户完全有意义的排序(对于用户来说,这些版本控制模式并不难看出)。对于此类排序,我应该研究什么?

【问题讨论】:

  • 这是真实数据吗?3.* 版本控制方案中,3/1/2011 上真的有一个版本,并且 在此之前有一个版本2/1/20111.* 版本控制方案中?
  • 是的,不幸的是,这是基于真实数据(为了简单起见,我刚刚复制的那一天除外)。这也是为什么我需要比常规排序更好的排序(并且还要排除高版本号的一次性)。
  • @MichaelPerrenoud - 请使用公制日期格式以避免混淆 - yyyy-MM-dd。
  • 您能否提供一个未排序项目的数组,然后提供一个包含您希望排序方式的项目的数组示例?
  • 我添加了两个完整的示例来说明我遇到的问题。

标签: c# algorithm linq sorting


【解决方案1】:

在您的算法中引入一个(date, major version, major version placeholder) 元组,该元组表示“将具有给定major version 的所有版本分成两组,一组在给定date 之前,一组在给定date 之前或之后,并将它们视为独立版本(它们是),并且在对版本进行排序时,将此“之后”版本组紧跟在给定的 major version placeholder 之后,就好像它是下一个主要版本一样”。

因此,对于您的包含四个元素的示例,如果您想要第一个结果,您可以将此元组提供给算法:

(2014-01-01, 3, 6)

如果你真的想要第二个结果,那么提供这个元组:

(2009-01-01, 3, 6)

除了主要版本,您还可以使用完整的四部分版本。逻辑是一样的。

【讨论】:

  • 这看起来是一种有趣的方法,但依赖于你必须预先知道版本的事实(我不知道)。对于真实数据,也可能存在多个组(假设一个具有主要版本 3,一个具有 6 和一个具有 7)。
  • 那么你将引入三个这样的元组。除了将它们标记为异常之外,没有其他方法可以处理异常。想象一下,几个人应该做这项工作,只给出日期和版本。我敢打赌,他们每个人都会给你自己对什么是正确的看法。
  • 嗯,对于普通人来说,做什么是很明显的(到目前为止没有人做错)。另外,并非总是可以按专业排序。以 1.0.0.1、1.0.0.2、1.2.0.1、1.0.0.3 为例。这意味着我必须像以前一样“跳过”1.2.0.1。
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2018-06-23
  • 2013-07-09
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多