public override void EvaluateInternal(H holder, MemberInfo groupKey) { // вычисляем переменную из котрой следует получить значения CalculatedVariable <H, T, I> basedVar = (CalculatedVariable <H, T, I>)DependsOn.Single(); basedVar.Evaluate(holder, groupKey, LastMoniker); // для каждого периода времени вычисляем значение переменной foreach (var tp in Period.Periods.Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name))) { I next = Period.Periods.FirstOrDefault(p => Operator.GreaterThan(p, tp.T)); var subPeriod = basedVar.Period.Between(tp.T, next); List <T> result = Activator.CreateInstance <List <T> >(); Int32 c = 0; foreach (I s in subPeriod) { var ta = new TimeArg <I>(s, c++, groupKey, basedVar.Period.Name, basedVar.Name); result.Add((T)basedVar.Results[ta]); } Results.Add(tp, result); // если требуется вернуть значение переменной, то записываем результат в свойство // holder, это свойство будет содержить список значений всех переменных на момент времени t if (Readers.Any()) { ApplyValueForHolder(holder, tp); ExecuteAllReaders(tp); } } }
public override void EvaluateInternal(H holder, MemberInfo groupKey) { // вычисляем переменную из котрой следует получить значения CalculatedVariable <H, T, I> basedVar = (CalculatedVariable <H, T, I>)DependsOn.Single(); // check basedVar.Period == this.Period; (они должны совпадать) basedVar.Evaluate(holder, groupKey, LastMoniker); var periods = Period.Periods.Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name)); if (Shift >= 0) { ShiftData(basedVar, periods, Shift); } else { var p2 = Period.Periods.Reverse().Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name)); ShiftData(basedVar, p2, -Shift); } foreach (var tp in periods) { if (Readers.Any()) { ApplyValueForHolder(holder, tp); ExecuteAllReaders(tp); } } }
public override void EvaluateInternal(H holder, MemberInfo groupKey) { // вычисляем переменную из котрой следует получить значения CalculatedVariable <H, T, I> basedVar = (CalculatedVariable <H, T, I>)DependsOn.Single(); // вычислять не требуется, т.к. переменная должна быть уже вычислена в более глубокой группе // для каждого периода времени вычисляем значение переменной foreach (var tp in Period.Periods.Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name))) { Dictionary <K, T> result = Activator.CreateInstance <Dictionary <K, T> >(); //foreach (var p in basedVar.Results.Where(pair => pair.Key.T == tp.T && pair.Key.ForMember.ParentMember == groupKey)) foreach (var p in basedVar.Results.Where(pair => Operator.Equal(pair.Key.T, tp.T) && pair.Key.ForGroupMember.Parents.Contains(groupKey))) { result.Add((K)p.Key.GroupKey, p.Value); } Results.Add(tp, result); // если требуется вернуть значение переменной, то записываем результат в свойство // holder, это свойство будет содержить список значений всех переменных на момент времени t if (Readers.Any()) { ApplyValueForHolder(holder, tp); ExecuteAllReaders(tp); } } }