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