[英]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.