Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和LINQ重新分配值_C#_Linq_Math - Fatal编程技术网

使用C#和LINQ重新分配值

使用C#和LINQ重新分配值,c#,linq,math,C#,Linq,Math,我正在寻找一些关于逻辑问题的帮助,希望有人能够帮助我使用C#和LINQ有效地解决我的问题 我有以下不同条款的服务清单: Item | RecurringMonthlyCharge | Term | Commission ------------------------------------------------------- Service 1 | $10.00 | 12 | $100.00 Service 2 | $12.00

我正在寻找一些关于逻辑问题的帮助,希望有人能够帮助我使用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美元后,平均重新分配
每月重复收费
字段(考虑“期限”)

例如,如果我将佣金总额贴现50.00美元,我希望将50美元分成3行,并考虑期限

以“服务1”为例,其结果如下:

10 - (50/12) = $5.83/mo
我的问题是如何在考虑到不同的期限长度的情况下,在所有行上按比例执行此操作。也许通过公因子或加权技术

几点:

 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;
        }
  • 佣金为期限(即服务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;
        }
private静态十进制GetRecurringCostEquiv(列表项)
{
var discVal=获得折扣(项目2);
十进制?结果=0.00M;
十进制系数=1.00M/项。其中(x=>x.ProductTypeId==2)。总和(i=>i.RecurringTerm??0);
结果=项目。选择(i=>i.RecurringCostCore-i.RecurringTerm*因子*discVal).Sum();
返回结果??0.00M;
}
简单伪代码:
RecurringMonthlyCharge[i]=$50*RecurringMonthlyCharge[i]/SUM(RecurringMonthlyCharge)


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

基于你的例子,你会这么想吗

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

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

如果我正确地得到了要求,接下来应该可以工作:


const双折扣=50;
var items=新列表()
{
新服务{Item=“Service1”,每月重复收费=10,期限=12,佣金=100},
新服务{Item=“Service2”,每月重复收费=12,期限=18,佣金=200},
新服务{Item=“Service3”,每月重复收费=14,期限=12,佣金=300}
};
//计算总期限
double totalTerms=items.Sum(x=>x.Term);
var searchedItems=items.Select(service=>service.RecurringMonthlyCharge-(折扣/总条款)*service.Term);

在这种情况下,这不是应该是10-(50*(12/(12+18+12))?您能详细介绍一下“佣金总额”和各行的拆分吗?在你的例子中,似乎所有50美元的佣金减免都适用于服务1?@AakashM-在我的例子中,它适用于一条线。我的要求是在总折扣的基础上减少每条线路的每月重复收费。为了清晰起见,我增加了几点。感谢您的回复,但这将在线路之间平均分配。我想考虑一下这个术语(因此#2是9.22美元(12-(50/18))。此外,如果佣金减少,每月定期费用也会减少。感谢您更新答案。我如何在您的第二个示例中应用折扣?它肯定更接近我想要的位置。嗯,选择的结果是您的新的每月定期费用,对吗?所以,用新的值替换旧的值。这可以一次性完成ch-loop。谢谢你对我耐心,但我还没有完全理解。我唯一的输入是“总折扣”,在你上面给出的第二个例子中似乎没有使用。再次感谢你的评论。我用我的方法更新了我的答案,但它计算的数字太离谱了。有什么想法吗?我很困惑,你做了一个求和,所有项目只有一个结果。我想这是每个项目的一个变化?如果不是这样,我恐怕我仍然会不要得到你的要求。。。