C# Linq与TakeWhile在C中

C# Linq与TakeWhile在C中,c#,entity-framework,linq,c#-4.0,C#,Entity Framework,Linq,C# 4.0,获取最佳卡片列表的最佳方式是什么?例如,我想获得礼品卡以申请订单总数100。它应该返回最佳组合,如30+40+75。下面是我当前的代码,在30+40=70后停止,这是错误的,因为订单总数超过70,所以我们不能只申请两张礼品卡。如上图所示,应归还3张礼品卡 [Test] public void GetBestAvailableGiftCards() { var list = new List<GiftCard> { new GiftCard() {Car

获取最佳卡片列表的最佳方式是什么?例如,我想获得礼品卡以申请订单总数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难问题,请尝试使用一些动态算法。

如果我答对了您的问题,您将尝试选择礼品卡的一些子集,以便它们的余额之和尽可能接近orderTotal,即更少或相等的orderTotal。在给定的情况下,最好的选择是只给用户85卡,因为我觉得没有其他组合更好


遗憾的是,这不能简单地通过直接使用LINQ来解决。如果这不是NP难问题,请尝试使用一些动态算法。

这是的通常行为,只要指定的条件为真,它就会从序列返回元素

您必须对其进行一些调整,以包括下一个使条件为真的附加值

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

选中此项

这是的常见行为,只要指定的条件为真,它就会返回序列中的元素

您必须对其进行一些调整,以包括下一个使条件为真的附加值

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

检查此项

您的代码有什么问题?它会给你错误的结果吗?你希望得到什么样的输出?它停在那里,因为下一个结果是30+40+75,大于你的支票上的100。为什么正确的结果是3张卡?30+40+75=145,大于100。30+40+75你要解决的问题是,越具体地说,它是。我建议您在尝试半心半意的解决方案之前仔细阅读一下。您的代码有什么问题?它会给你错误的结果吗?你希望得到什么样的输出?它停在那里,因为下一个结果是30+40+75,大于你的支票上的100。为什么正确的结果是3张卡?30+40+75=145,大于100。30+40+75你要解决的问题是,越具体地说,它是。我建议你在尝试半心半意的解决方案之前仔细阅读一下。它必须是bool returnvalue=current