Перераспределение значений с использованием C # и LINQ - PullRequest
1 голос
/ 21 февраля 2012

Мне нужна помощь с проблемой логики, и я надеюсь, что кто-нибудь сможет помочь мне с эффективным способом решения моей проблемы с использованием C # и LINQ .

У меня естьследующий список услуг с различными условиями:

Item      | RecurringMonthlyCharge  | Term | Commission
-------------------------------------------------------
Service 1 | $10.00                  | 12   | $100.00
Service 2 | $12.00                  | 18   | $200.00
Service 3 | $14.00                  | 12   | $300.00

Моя цель состоит в том, чтобы повторно распределить поле RecurringMonthlyCharge равномерно (с учетом «срока») после уменьшения общей комиссии на $ x.

Например, если я дисконтирую общую сумму на 50,00 долларов США, я хотел бы разделить эти 50 долларов на 3 строки и принять во внимание термин.

Использование «Сервис 1» в качествеНапример, это будет выглядеть так:

10 - (50/12) = $5.83/mo

Мой вопрос заключается в том, как сделать это пропорционально по всем строкам, учитывая при этом различную длину термина.Возможно, с помощью общего множителя или метода взвешивания?

Несколько баллов:

  • Комиссия за срок (т. Е. За услугу 1 выплачивается комиссия в размере 100,00 долл. США, основанная на12-месячное соглашение)
  • Общая примененная скидка должна быть вычтена равномерно из ежемесячных периодических платежей, принимая во внимание срок, итоговую сумму скидки (50 долларов в моем примере).

Попытка № 1:

 private static decimal GetRecurringCostEquiv(List<QuotationItemViewModel> items)
        {

            var discVal = GetDiscounts(items, 2);
            decimal? result = 0.00M;

            decimal factor = 1.00M / items.Where(x => x.ProductTypeId == 2).Sum(i => i.RecurringTerm ?? 0);
            result = items.Select(i => i.RecurringCostCore - i.RecurringTerm * factor * discVal).Sum();

            return result ?? 0.00M;
        }

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Основываясь на вашем примере, не так ли?

var listOfResults = 
  Items.Select(i => i.RecurringMonthlyCharge - (Discount / i.Term))

Теперь, если вы на самом деле хотите уменьшить это пропорционально, самое простое - использовать сумму всехТермины в качестве основы для вашего фактора:

double factor = 1.0 / Items.Sum(i => i.Term); 
var listOfResults = 
  Items.Select(i => i.RecurringMonthlyCharge - i.Term * factor * Discount))

Если ваш набор данных огромен, возможно, придется использовать какой-то другой подход, но для разумных размеров это должно сработать

0 голосов
/ 21 февраля 2012

Если я правильно понял требование, должно работать следующее:


            const double discout = 50;
            var items = new List<Service>()
            {
            new Service{Item = "Service1", RecurringMonthlyCharge = 10, Term = 12, Commision = 100},

            new Service{Item = "Service2", RecurringMonthlyCharge = 12, Term = 18, Commision = 200},

            new Service{Item = "Service3", RecurringMonthlyCharge = 14, Term = 12, Commision = 300}
                            };
            //calculate total terms
            double totalTerms = items.Sum(x => x.Term);
            var searchedItems = items.Select(service => service.RecurringMonthlyCharge - (discout/totalTerms)*service.Term);
0 голосов
/ 21 февраля 2012

Простой псевдокод: RecurringMonthlyCharge[i] = $50 * RecurringMonthlyCharge[i] / SUM(RecurringMonthlyCharge)

Конкретно вы получите $ 13,88, $ 16,66, $ 19,44.Вы об этом думаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...