【问题标题】:Regular spacing of data depending on a number数据的规则间距取决于数字
【发布时间】:2021-11-03 07:24:33
【问题描述】:

我正在尝试根据这些的最早日期和最晚日期创建甘特图:

workpackages[0] = new WorkPackage("Package 1", new DateTime(2021, 1, 1), new DateTime(2021, 1, 2));
workpackages[1] = new WorkPackage("Package 2", new DateTime(2021, 2, 2), new DateTime(2021, 3, 3));
workpackages[2] = new WorkPackage("Package 3", new DateTime(2021, 3, 6), new DateTime(2021, 6, 10));
workpackages[3] = new WorkPackage("Package 4", new DateTime(2021, 4, 2), new DateTime(2021, 6, 5));
workpackages[4] = new WorkPackage("Package 5", new DateTime(2021, 3, 2), new DateTime(2021, 4, 5));
workpackages[5] = new WorkPackage("Package 6", new DateTime(2021, 4, 2), new DateTime(2021, 5, 5));
workpackages[6] = new WorkPackage("Package 7", new DateTime(2021, 2, 4), new DateTime(2021, 3, 3));

程序会创建一个数组,该数组的长度与最早日期 (1.1.2021) 和最晚日期 (10.6.2021) 之间的时间跨度一样长,即 160 天。现在我可以将所有日期放在一起,例如 1.1.2021、2.1.2021、3.1.2021……但我希望用户决定他想要多少抽动。因此,如果他输入 10,他应该得到 12 个日期(开始和结束),它们之间的距离是固定的,如果他输入 3 作为他想要的抽动次数,他会得到开始日期和结束日期,以及中间的日期这两个。但是我需要做些什么计算呢?

顺便说一句,如果你不知道甘特图是什么,this is one

到目前为止,这是我的方法,但我无法解决问题:

public void ArrayDate(DateTime start, DateTime end, int n)
    {
        double timeSpan;

        timeSpan = (end - start).TotalDays;

        DateTime[] alldates = new DateTime[(int)timeSpan];

        for (int i = 0; i < timeSpan; i++)
        {
            alldates[i] = start.AddDays(i);
        }
    }

【问题讨论】:

    标签: c# gantt-chart


    【解决方案1】:

    您只能使用可以除以完整数字作为结果的数字来执行此操作,因此它适用于例如 11。然后每个日期之间有 16 天。这就是你必须做的来解决它:

    double timeSpan;
    n = 11;
    
    timeSpan = (end - start).TotalDays;
    
    DateTime[] alldates = new DateTime[n];
    
    int timeStep = (int)timeSpan / (n - 1);
    
    for (int i = 0; i < n; i++)
    {
        alldates[i] = start.AddDays(i * timeStep);
    }
    

    因此,您只需将 timeSpan 除以您拥有的日期数,即可创建一个新变量 (timeStep),该变量具有每个日期之间的距离数,那么您仍然需要执行 -1,否则您将无法除以通过获得一个完整的数字,-1 是日期之间有多少间隔的确切数量,我给你一点example for that。正如您在图片中看到的 n = 3 和 -1 它是可分割的,它是日期之间的间隔数。然后你只需执行AddDays() 并执行 i * timeStep。这将是 0 * 16 所以在第一次迭代中你得到第一个日期,因为它是 0 的时间,然后在第二次迭代中它将是 1 * 16 将是 16,然后是 2 * 16 等等,所以你总是添加16 天乘以 i。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2020-03-29
      • 2015-10-04
      • 1970-01-01
      • 2015-02-09
      相关资源
      最近更新 更多