繁体   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