[英]Linq With TakeWhile in C#
什么是获得最佳卡列表的最佳方法,例如,我想获得礼品卡以申请总计100张订单。它应返回30 + 40 + 75之类的最佳组合。 下面是我当前的代码,该代码在30+40 = 70
之后停止,这是错误的,因为订单总数超过70,所以我们不能仅应用两张礼品卡。 如上图所示,它应该返回3张礼品卡。
[Test]
public void GetBestAvailableGiftCards()
{
var list = new List<GiftCard>
{
new GiftCard() {CardNumber = "45964123358448514", SecurityCode = "032443", Balance = 75},
new GiftCard() {CardNumber = "45964123345954414", SecurityCode = "032443", Balance = 85},
new GiftCard() {CardNumber = "45964062845645735", SecurityCode = "435448", Balance = 40},
new GiftCard() {CardNumber = "28872034245533173", SecurityCode = "934465", Balance = 30}
};
var orderTotal = 100;
double current = 0;
var cards = list
.OrderBy(x => x.Balance)
.TakeWhile(card => (current = current + card.Balance) <= orderTotal)
.ToList();
}
如果我的问题是对的,则您尝试选择礼品卡的一些子集,以使它们的余额总和尽可能接近orderTotal
,但仍小于或等于orderTotal
。 在给定的情况下,最好的选择是只给用户一张85张卡片,因为在我看来,没有其他组合可以比这更好。
可悲的是,这不能简单地通过直接使用LINQ来解决。 如果这不是NP难题,请尝试使用一些动态算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.