public override PConstrianResult test(object newValue)
 {
     ci = -1; var bc = int.MinValue; result = null;
     for (int i = 0; i < list.Length; i++)
     {
         var av = list[i];
         if (newValue.Equals(av))
         {
             result = new PConstrianResult(PCostrainStatus.PASSED);
             bc     = int.MaxValue;
             ci     = i; break;
         }
         else
         {
             var c = -Math.Abs((double)newValue - (double)(object)av);
             if (bc < c)
             {
                 bc = (int)c; ci = i;
             }
         }
     }
     if (!result)
     {
         result = new PConstrianResult(PCostrainStatus.CORRECTED);
     }
     result.setCore(bc);
     return(result);
 }
 public void Add(PConstrianResult r)
 {
     all.Add(r);
     if (            //_status != PCostrainStatus.REFUSED &&
         r.status == PCostrainStatus.CORRECTED)
     {
         _status = r.status; _info = "Corrected by inner constrian.";
     }
     else if (r.status == PCostrainStatus.REFUSED)
     {
         _status = r.status; _info = "Refused by inner constrian.";
     }
 }
        //public override PConstrianResult test(object nv) {
        //	var md = (dynamic)max - (dynamic)nv;
        //	var maxOk = ((dynamic)nv < (dynamic)max) ||
        //		(includeMax && ((dynamic)nv == (dynamic)max));
        //	if (!maxOk) { result = toBig; return toBig; }

        //	var minOk = ((dynamic)nv > (dynamic)min) ||
        //		(includeMin && ((dynamic)nv == (dynamic)min));
        //	if (!minOk) { result = toSmall; return toSmall; }

        //	result = inRange; return inRange;
        //}

        public override PConstrianResult correct <M>(M value, ref M c)
        {
            if (!result)
            {
                test(value);
            }
            if (result == inRange)
            {
                c = value;
            }
            else if (result == toBig)
            {
                c = (includeMax) ? max : Math.Round((dynamic)max - sub);
            }
            else if (result == toSmall)
            {
                c = (includeMin) ? min : Math.Round((dynamic)min + add);
            }
            var r = result; result = null; return(r);
        }
        public override PConstrianResult test(object nv)
        {
            var xd    = (dynamic)max - (dynamic)nv;
            var maxOk = xd > 0 || (includeMax && xd == 0);

            if (!maxOk)
            {
                result = toBig.setCore((int)xd); return(toBig);
            }

            var nd    = (dynamic)nv - (dynamic)min;
            var minOk = nd > 0 || (includeMin && nd == 0);

            if (!minOk)
            {
                result = toSmall.setCore((int)nd); return(toSmall);
            }

            result = inRange; return(inRange);
        }
 public PConstrianResult(PCostrainStatus status, PConstrianResult cause = null, string info = null)
 {
     this._status = status;
     this._cause  = cause;
     this._info   = info;
 }