동일한 길이를 가진 두 번째 배열에서 조건부 배열의 값에 대한 평균 또는 합계 또는 다른 방법을 계산하고 싶습니다.두 번째 배열에서 조건부 배열 (값)
예를 들어, 날짜가 double (] dts) 인 정렬 된 배열이 있고 값 배열 (double [] vals)보다 시작일 (std)과 종료일 (edd) 사이의 평균을 계산하고 싶습니다.) (간단하고 아래 코드를 참조하십시오).
하지만 예를 들어 계산하고 싶다면 아래의 코드가 더 이상 일하지 않는 한 모든 월요일의 평균. 어떤 아이디어? 감사!
public static double aggr(double[] dts, double[] vals, double std, double edd)
{
int stdindex = 0;
int eddindex = dts.Length;
for (int k = 0; k < dts.Length; k++)
{
if (dts[k] == std)
{
stdindex = k;
}
if (dts[k] == edd)
{
eddindex = k;
}
}
return vals.Skip(stdindex).Take(eddindex-stdindex).Average();
}
모두들. 모든 대답이 효과가 있다고 생각합니다. 새 코드는 다음과 같습니다.
public static double aggr(double[] dts, double[] vals, double std, double edd, string peakoffpeakbase, double sumavg)
{
double result;
if (sumavg == 1)
{
if (peakoffpeakbase=="Peak")
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std & dv.d < edd & DateTime.FromOADate(dv.d).DayOfWeek != DayOfWeek.Saturday & DateTime.FromOADate(dv.d).DayOfWeek != DayOfWeek.Sunday & DateTime.FromOADate(dv.d).Hour > 7 & DateTime.FromOADate(dv.d).Hour < 20))
.Select(dv => dv.v).Sum();
}
else if (peakoffpeakbase=="Offpeak")
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std & dv.d < edd & DateTime.FromOADate(dv.d).DayOfWeek == DayOfWeek.Saturday | DateTime.FromOADate(dv.d).DayOfWeek == DayOfWeek.Sunday | DateTime.FromOADate(dv.d).Hour < 8 | DateTime.FromOADate(dv.d).Hour > 19))
.Select(dv => dv.v).Sum();
}
else
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std && dv.d < edd))
.Select(dv => dv.v).Sum();
}
}
else
{
if (peakoffpeakbase == "Peak")
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std & dv.d < edd & DateTime.FromOADate(dv.d).DayOfWeek != DayOfWeek.Saturday & DateTime.FromOADate(dv.d).DayOfWeek != DayOfWeek.Sunday & DateTime.FromOADate(dv.d).Hour > 7 & DateTime.FromOADate(dv.d).Hour < 20))
.Select(dv => dv.v).Average();
}
else if (peakoffpeakbase == "Offpeak")
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std & dv.d < edd & (DateTime.FromOADate(dv.d).DayOfWeek == DayOfWeek.Saturday | DateTime.FromOADate(dv.d).DayOfWeek == DayOfWeek.Sunday | DateTime.FromOADate(dv.d).Hour < 8 | DateTime.FromOADate(dv.d).Hour > 19)))
.Select(dv => dv.v).Average();
}
else
{
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d >= std && dv.d < edd))
.Select(dv => dv.v).Average();
}
}
return result;
}
분명히 이것은 매우 끔찍하고 매우 장황합니다. 내가 정말하고 싶은 것은 좋아 아래의 답변을 결합 STH 쓰기입니다 :
result = dts.Zip(vals, (d, v) => new { d, v })
.Where(dv => (dv.d.InTimeRange(std,edd).IsBusinessHour(peakoffpeakbase))
.Select(dv => dv.v).CustomX(indicator);
InTimeRange 및 IsBusinessHour 아래에 설명하고 customX가 인수를 다음 중 평균, 합계 또는 STH 다른 할 것 같은 확장 방법이 있습니다
. 그러나 나는 그것을 작동시킬 수 없습니다. 다시 한 번 감사드립니다!
그래서 ... 무엇을 찾고 계십니까? – Nevyn
http://upload.wikimedia.org/math/7/e/e/7eea8d495207d82b31b927502464ed6a.png 날짜를 계산할 때 산술 평균을 사용할 수 없습니다. DateTime에 DateTime을 추가 할 수 없으며 DateTime을 n으로 나눌 수 없기 때문입니다. –
평균 방법의 결과로 얻으려는 것이 무엇입니까? –