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

时间:2014-05-27 12:41:37

标签: c# algorithm linq sorting

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

我们以此为例:

        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年)来区分不同的组别,然后根据他们的版本进行排序,但我不完全确定这是否会导致排序对用户来说是完全有意义的(对于用户来说,版本控制中的这些模式并不难看)。对于这种排序,我有什么需要考虑的吗?

1 个答案:

答案 0 :(得分:0)

在您的算法中引入一个(date, major version, major version placeholder)元组,其中说“将给定major version的所有版本分成两组,一组在给定的date之前,一组在...之后或之后对待它们好像它们是独立版本(它们是),并且排序版本在紧接给定major version placeholder之后将此“后”版本组放置,就好像它是下一个主要版本“。

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

(2014-01-01, 3, 6)

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

(2009-01-01, 3, 6)

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