繁体   English   中英

按发布日期和版本进行智能排序

[英]Smart sorting by release date and version

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

让我们以这个为例:

        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年),以便按照版本区分不同的组,然后按照版本进行排序,但是我不确定是否会导致排序对用户完全有意义(对于用户来说,版本控制中的这些模式不难发现)。 对于此类排序,我有什么需要研究的吗?

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

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

(2014-01-01, 3, 6)

如果您真的想要第二个结果,请提供此元组:

(2009-01-01, 3, 6)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM