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();
}