首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C#中的顺序日期识别分层数据中的父级

使用C#中的顺序日期识别分层数据中的父级
EN

Stack Overflow用户
提问于 2020-08-07 16:26:30
回答 1查看 41关注 0票数 0

我有一个任务和子任务列表(使用父-子关系),这些任务和子任务是用模板中的顺序日期创建的。我需要识别每个任务的家长根据模板父母Id和哪里的到期日与家长到期日。迷惑了?让我以身作则。这是我的班级:

代码语言:javascript
运行
复制
public class Task
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public int TemplateId { get; set; }
    public int? TemplateParentId { get; set; }
    public DateTime DueDate { get; set; }
}

以下是一些更有意义的数据:

代码语言:javascript
运行
复制
List<Task> tasks = new List<Task>( );

tasks.Add( new Task { Id = 1, ParentId = null, TemplateId = 1, TemplateParentId = null, DueDate = new DateTime( 2020, 12, 31 ) } );
tasks.Add( new Task { Id = 2, ParentId = null, TemplateId = 1, TemplateParentId = null, DueDate = new DateTime( 2021, 12, 31 ) } );

tasks.Add( new Task { Id = 3, ParentId = null, TemplateId = 2, TemplateParentId = 1, DueDate = new DateTime( 2020, 6, 1 ) } );
tasks.Add( new Task { Id = 4, ParentId = null, TemplateId = 2, TemplateParentId = 1, DueDate = new DateTime( 2021, 6, 1 ) } );
tasks.Add( new Task { Id = 5, ParentId = null, TemplateId = 2, TemplateParentId = 1, DueDate = new DateTime( 2021, 12, 31 ) } );

tasks.Add( new Task { Id = 6, ParentId = null, TemplateId = 3, TemplateParentId = null, DueDate = new DateTime( 2020, 10, 31 ) } );
tasks.Add( new Task { Id = 7, ParentId = null, TemplateId = 4, TemplateParentId = 3, DueDate = new DateTime( 2020, 10, 31 ) } );

其中3个是父任务,4个是TemplateParentId值的子任务。注意,对于所有任务,ParentId字段都是空的?这是我打算使用以下规则找到的值:

  • I只需要更新具有父任务的任务。所有顶级父母(以TemplateParentId == null为代表)都很好。

  • 我知道给定子任务的TemplateParentId,也知道DueDate。到期日必须在父母的下一个到期日之前。例如,如果子任务的TemplateParentId == 1,那么它的父任务具有TemplateId == 1,它的父任务将是最近的未来或相同日期的父任务。

具有相同日期的

  • 行将永远不会有相同的日期。它们总是以顺序日期的方式不同。--

例如,

  • 使用示例数据,前2行具有相同的TemplateId,但它们的到期日相隔一年。基本上,每年都需要完成同样的任务。行3、4和5是具有相同模板父级的子任务,但它们的到期日不同。这些任务需要在父母到期日之前或同一天完成。例如,任务3将于2020年6月到期,其中2个可能是父母,下一个最接近的日期是2020年12月。任务5将于2021年12月31日完成,下一个最接近的父母到期日是同一天,所以ParentId应该是2。

  • 列表没有特殊的顺序。

希望这是合理的。我不知道如何编写这段代码,但下面是我未经测试的大部分是代码:

代码语言:javascript
运行
复制
foreach( var task in tasks.OrderBy( t => t.DueDate ) )
{
    if ( task.TemplateParentId == null || task.ParentId.HasValue )
    {
        continue;
    }

    var parentId = tasks.Where( t => t.TemplateId == task.TemplateParentId && t.DueDate >= task.DueDate ).Select( t => t.Id ).LastOrDefault( );

    if( parentId > 0 )
    {
        // update the row with the ParentId, but this is not possible because it will alter the collection and an exception will ensue!
    }
}

我怎样才能做到这一点,而且效率高呢?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 00:58:01

这突出了Stackoverflow的值。在撰写这个问题时,我无意中想出了一个看似有效的解决方案:

代码语言:javascript
运行
复制
foreach( var task in tasks.OrderBy( t => t.DueDate ) )
{
    if ( task.TemplateParentId == null || task.ParentId.HasValue )
    {
        continue;
    }

    var parentId = tasks.Where( t => t.TemplateId == task.TemplateParentId && t.DueDate >= task.DueDate ).Select( t => t.Id ).FirstOrDefault( );

    if( parentId > 0 )
    {
        // store the value in a dictionary and process the updates afterwards
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63305767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档