簡體   English   中英

Linq與TakeWhile在C#中

[英]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();
}

這是TakeWhile的通常行為,只要指定條件為true,它就會從序列中返回元素。

您必須對此進行一些微調以包括下一個添加項(使條件成立)。

    var orderTotal = 100;
    double current = 0;
    var cards = list
        .OrderBy(x => x.Balance)
        .TakeWhile(card => 
         {              
            bool returnvalue = current < orderTotal; 
            current += card.Balance;
            return returnvalue;
        })
        .ToList();

檢查這個example

如果我的問題是對的,則您嘗試選擇禮品卡的一些子集,以使它們的余額總和盡可能接近orderTotal ,但仍小於或等於orderTotal 在給定的情況下,最好的選擇是只給用戶一張85張卡片,因為在我看來,沒有其他組合可以比這更好。

可悲的是,這不能簡單地通過直接使用LINQ來解決。 如果這不是NP難題,請嘗試使用一些動態算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM