[英]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.