C# Linq与TakeWhile在C中
获取最佳卡片列表的最佳方式是什么?例如,我想获得礼品卡以申请订单总数100。它应该返回最佳组合,如30+40+75。下面是我当前的代码,在30+40=70后停止,这是错误的,因为订单总数超过70,所以我们不能只申请两张礼品卡。如上图所示,应归还3张礼品卡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
[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