1

我有以下课程:

public class Datum
{
    public DateTime DateTime;
    public double Value;
}

使用这些扩展方法:

 public static double Sum(this IEnumerable<Datum> @this)
    {
        return @this.Sum(datum => datum.Value);
    }


 public static IEnumerable<Datum> InTimeRange(this IEnumerable<Datum> @this, DateTime start, DateTime end)
    {
        return from datum in @this
               where (start <= datum.DateTime && datum.DateTime < end)  
               select datum;
    }

 public static IEnumerable<Datum> ForEach(this IEnumerable<Datum> @this, object businesshours)
    {

        var pob = businesshours.ToString();
        switch(pob)
        {
            case "business": 
                return from datum in @this
                       where (datum.DateTime.DayOfWeek != DayOfWeek.Sunday & datum.DateTime.DayOfWeek != DayOfWeek.Saturday & datum.DateTime.Hour > 7 & datum.DateTime.Hour < 20)
                       select datum;

            case "offhours": 
                return from datum in @this
                       where !(datum.DateTime.DayOfWeek != DayOfWeek.Sunday & datum.DateTime.DayOfWeek != DayOfWeek.Saturday & datum.DateTime.Hour > 7 & datum.DateTime.Hour < 20)
                       select datum;
             default:
                return from datum in @this
                       select datum;
        }
    }

public static IEnumerable<Datum> Addition(this IEnumerable<Datum> @this, double val)
    {
        foreach (var datum in @this)
        {
            datum.Value += val;
        }
        return @this;
    }

如果我想总结所有工作时间,我可以这样做:

somelist.ForEach(busineshourindicator).InTimeRange(startdate, enddate).Sum();

这没有任何问题,如果 businessindicator = "business" 它仅在给定时间范围内的工作时间内求和。

但是,如果我想将所有这些组合在一个 for 循环中并在一个小时的时间表中组合多个数字(像这样):

        public static double[] hourlyvec(double[] DelStart, double[] DelEnd, double[] position, object[] businessindicator, double PosStart, double PosEnd)
    {
        double nrhrs = (PosEnd - PosStart + 1) * 24;

        List<Datum> result = new List<Datum>();
        double tempdate = PosStart;
        for (int i = 0; i < nrhrs; ++i)
        {
            result.Add(new Datum { DateTime = DateTime.FromOADate(tempdate), Value = 0 });
            tempdate += (1 / 24);
        }


        for (int k = 0; k < DelStart.Length; k++)
        {
            result.ForEach(businessindicator[k]).InTimeRange(DateTime.FromOADate(DelStart[k]), DateTime.FromOADate(DelEnd[k])).Addition(position[k]);
        }

        return result.todoub().ToArray();

    }

这失败了。我期望的快速示例:

第一行:Delstart = 3/1/13,DelEnd = 4/1/13,Businessindicator =“Business”,Position = 100

第二行:Delstart = 3/1/13,DelEnd = 4/1/13,Businessindicator ="Offhours",Position = 50

第三行:Delstart = 3/1/13,DelEnd = 4/1/13,Businessindicator =“ALL”,Position = 75

开始 = 13 年 3 月 1 日,结束 = 13 年 4 月 1 日

然后该函数应返回 24 小时的每小时向量,其中 1-8 小时 = 125,9-20 小时 = 175,其余小时再次为 125。

所有这些扩展方法似乎都可以单独使用,但是当我将它们组合成一个循环时,我没有得到正确的答案。

抱歉这篇冗长的帖子,我希望我的意思很清楚。

谢谢!

4

0 回答 0