| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | using iBemsDataService.Controllers.Bems.Common;using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace iBemsDataService.Controllers.Bems.Formula{    public class ParameterBox    {        public DateTime DateTime { get ; set; }        Box[] boxes;        public ParameterBox( CalculationParameter[] parameters )        {            this.boxes = new Box[parameters.Length];            for( int i = 0 ; i < parameters.Length ; i++ )            {                var box = this.boxes[i] = new Box();                box.parameter = parameters[i];            }        }        public bool NextStage()        {            for( var i = 0 ; i < this.boxes.Length ; i++ )            {                var box = this.boxes[i];                box.Set = false;                if( box.Next() == false )                {                    return false;                }            }            return true;        }        public bool Sync()        {            if (this.boxes == null || this.boxes.Length == 0) return false;            var value = this.boxes[0].GetValue();            if( value == null )                return false;            var dateTime = value.DateTime;        Loop:            for( var i = 0 ; i < this.boxes.Length ; i++ )            {                var box = this.boxes[i];                if( box.Set )                {                    continue;                }                switch( box.Sync( dateTime ) )                {                    case -1: // 없다. 더이상 계산이 필요 없다.                        return false;                    case 0:  // 동일한 것이 있다.                         box.Set = true;                        break;                    case 1:  // 초과한 시간이 있다.                         dateTime = box.GetValue().DateTime;                        goto Loop;                }            }            this.DateTime = dateTime;            return true;        }        class Box        {            public enum IndexAtDateTimeResult            {                            };            public bool Set { get; set; }            public int currentIndex = 0;            public CalculationParameter parameter;            public IndexAtDateTimeResult Result { get; set; }            public Box()            {                Set = false;            }            public bool Next()            {                this.currentIndex++;                return (this.currentIndex < parameter.Values.Length);            }            public int Sync( DateTime dateTime )            {                var values = parameter.Values;                if( values != null )                {                    for( var i = currentIndex ; i < values.Length ; i++ )                    {                        if( values[i].DateTime == dateTime )                        {                            this.currentIndex = i;                            this.Setup();                            return 0;                        }                        if( dateTime < values[i].DateTime )                        {                            this.currentIndex = i;                            return 1;                        }                    }                }                return -1;            }            public CalculationValue GetValue()            {                if( parameter.Values == null )                    return null;                if( parameter.Values.Length <= currentIndex )                    return null;                return parameter.Values[currentIndex];            }            public void Setup()            {                this.Set = true;                this.parameter.SetValueFromIndex( currentIndex );            }        }    }}
 |