【问题标题】:Reapportioning values using C# and LINQ使用 C# 和 LINQ 重新分配值
【发布时间】:2012-03-11 15:33:54
【问题描述】:

我正在寻求有关逻辑问题的帮助,并希望有人能够帮助我以一种有效的方式使用 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

我的目标是在将总佣金减少 $x 后平均重新分配 RecurringMonthlyCharge 字段(考虑到“期限”)。

例如,如果我将 总佣金 折扣 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;
        }

【问题讨论】:

  • 在这种情况下不应该是 10 - (50 * (12/(12+18+12))) 吗?
  • 您能否详细介绍“total 佣金”和分行?在您的示例中,似乎所有 50 美元的佣金减少都已应用于服务 1?
  • @AakashM - 在我的示例中,它适用于单行。我的要求是根据总折扣减少每行的 RecurringMonthlyCharge。
  • 为了清楚起见,我添加了几点。

标签: c# linq math


【解决方案1】:

根据你的例子,你不会吗?

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))

如果您的数据集很大,则可能必须使用其他方法,但对于合理的大小,这应该可以很好地工作

【讨论】:

  • 感谢您更新您的答案。如何在您的第二个示例中应用折扣?它肯定离我想去的地方更近了。
  • 嗯,选择的结果是您的新 RecurringMonthlyCharge,对吗?因此,用新值替换旧值。这可以在 foreach 循环中完成。
  • 感谢您对我的耐心,但我仍然没有完全理解它。我唯一的输入是“总折扣”,您在上面给出的第二个示例中似乎没有使用它。
  • 再次感谢您的评论。我用我的方法更新了我的答案,但它计算的数字还很遥远。有什么想法吗?
  • 我很困惑你做了一个总和并且所有项目只有一个结果。我认为这是每个项目的更改?如果不是这样,恐怕我还是达不到您的要求……
【解决方案2】:

简单的伪代码: RecurringMonthlyCharge[i] = $50 * RecurringMonthlyCharge[i] / SUM(RecurringMonthlyCharge)

具体来说,您最终会得到 13.88 美元、16.66 美元、19.44 美元。你是这么想的吗?

【讨论】:

  • 感谢您的回复,但这会将其平均分配给各行。我想考虑这个期限(所以 #2 将是 9.22 美元(12 - (50/18))。此外,如果佣金减少,每月的经常性费用也会减少。
【解决方案3】:

如果我的要求正确,接下来应该可以工作:


            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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2021-06-28
    • 2016-01-02
    • 1970-01-01
    • 2013-12-05
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多