Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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# - Fatal编程技术网

C# 在循环中组合多种扩展方法

C# 在循环中组合多种扩展方法,c#,C#,我在以下课程中有一门课: 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 IEnum

我在以下课程中有一门课:

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;
    }
这是毫无问题的,如果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

Posstart=3/1/13,PosEnd=4/1/13

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

所有这些扩展方法似乎都是在单独的基础上工作的,但是当我将它们组合在一个循环中时,我没有得到正确的答案

对不起,这篇文章太罗嗦了,我希望我的意思很清楚


谢谢

我没有得到正确的答案。你得到了什么答案?我只是得到了所有时间的相同数字,好像工作时间和非工作时间之间的界限不起作用,但当我将其与求和方法结合使用时,它确实起到了正确的作用。你不应该在查询运算符中造成副作用。添加不应该改变所提供的项,它应该创建一个全新的序列,该序列包含新项,这些新项是为每个项添加值的结果。所有其他操作员都正确无副作用。不过,ForEach操作符的命名并不正确。你并不是对每一项都做些什么,你实际上是在符合某些条件的地方对其进行过滤…@Servy:谢谢,我明白你的意思。但是,接下来如何将新创建的列表传递给循环的下一个迭代?或者,您是否建议为循环的每次迭代创建一个向量,然后将它们全部相加?@npvh您的相加可以使用Select实现。您需要为每个上一个创建一个新的基准,并将新基准的值设置为上一个的值加上其他值。return@this.Selectd=>newdatum{DateTime=d.DateTime,Value=d.Value+val};
        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();

    }