示例#1
0
        public List <NPVSet> CalculateSetOfNPV(CalculateSetOfNPVRequest request)
        {
            var totalDiscountInterestRateRequest = new GetTotalDiscountRateIncrementRowsRequest
            {
                Increment = request.Increment
                ,
                UpperBoundDiscountRate = request.UpperBoundDiscountRate
                ,
                LowerBoundDiscountRate = request.LowerBoundDiscountRate
            };


            ValidateInputs(totalDiscountInterestRateRequest, request);

            var listOfInterests = BuildConcurrentCollectionOfInterest(totalDiscountInterestRateRequest);

            var dictionary = new ConcurrentDictionary <double, NPVSet>();

            Parallel.ForEach(listOfInterests, (interest) =>
            {
                var discountRate = interest / 100;
                var npv          = CalculateIndividualNPV(new CalculateIndividualNPVRequest {
                    CashFlows      = request.CashFlow
                    , InitialValue = request.InitialCost
                    , Interest     = discountRate
                });

                var npvSet = new NPVSet
                {
                    CashFlowSummary = string.Join(", ", request.CashFlow.ToArray())
                    ,
                    DiscountRate = interest
                    ,
                    InitialCost = Math.Abs(request.InitialCost)
                    ,
                    NPV = Math.Round(npv, 2)
                };

                dictionary.AddOrUpdate(interest, npvSet, (dr, set) => npvSet);
            });

            var listOfKeys = dictionary.Keys.ToList();

            listOfKeys.Sort();

            var finalList = new List <NPVSet>();

            listOfKeys.ForEach(k =>
            {
                finalList.Add(dictionary[k]);
            });
            return(finalList);
        }
示例#2
0
        private ConcurrentBag <double> BuildConcurrentCollectionOfInterest(GetTotalDiscountRateIncrementRowsRequest request)
        {
            var retValue = new ConcurrentBag <double>();
            var lowerLimitDiscountRate = request.LowerBoundDiscountRate;

            while (lowerLimitDiscountRate <= request.UpperBoundDiscountRate)
            {
                retValue.Add(lowerLimitDiscountRate);
                lowerLimitDiscountRate += request.Increment;
            }
            return(retValue);
        }