Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按发布日期和版本进行智能排序_C#_Algorithm_Linq_Sorting - Fatal编程技术网

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

C# 按发布日期和版本进行智能排序,c#,algorithm,linq,sorting,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 = n

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

以此为例:

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

在算法中引入一个
(日期、主要版本、主要版本占位符)
元组“将具有给定<代码>主要版本的所有版本分为两组,一组在给定<代码>日期之前,一组在给定<代码>日期或之后,并将其视为独立版本(即独立版本),在对版本进行排序时,将此“之后”版本组放在给定<代码>主要版本占位符之后。”,好像它是下一个主要版本”

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

(2014-01-01, 3, 6)
如果您确实想要第二个结果,请提供以下元组:

(2009-01-01, 3, 6)

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

这是真实的数据吗?在
3.*
版本控制方案中是否真的有2011年3月1日的版本,在
1.*
版本控制方案中是否有2011年2月1日之前的版本?是的,这很不幸基于真实数据(为了简单起见,我刚才复制的那一天除外)。这也是为什么我需要一个比常规排序更好的排序(并且排除高版本号的一次性排序).@MichaelPerrenoud-请使用公制日期格式以避免混淆-yyyy-MM-dd。您能提供一个未排序项目的数组,然后提供一个按您希望的方式排序的项目的数组示例吗?我添加了两个完整的示例,说明了我遇到的问题。这看起来是一个有趣的方法,但依赖于您有预先了解版本(我不知道)。根据实际数据,也可能有多个组(比如一个主要版本为3,一个主要版本为6,一个主要版本为7)。然后你会介绍三个这样的元组。除了将异常标记为这样,没有其他方法可以处理它们。想象一下,如果只给出日期和版本,那么几个人应该做这项工作。我打赌他们每个人都会给你自己关于什么是正确的看法。嗯,正常人的眼睛很清楚该做什么(到目前为止还没有人做错这件事)。此外,并非总是可以按专业排序。以1.0.0.1、1.0.0.2、1.2.0.1、1.0.0.3为例。这意味着我必须像以前一样“跳过”1.2.0.1。