Linq与C#中的TakeWhile

时间:2016-06-06 09:01:43

标签: 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() {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();
}

2 个答案:

答案 0 :(得分:6)

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

你必须调整这一点以包含下一个加法(使条件成立)。

files = glob.glob('*.txt')
files.sort()
for infile in files:
    year,formatt = infile.split('.')
    year = year.split('_')[1]
    ws = [4,9,7,7,7,7,7,7,7,7,7,7,7]
    df = pd.read_fwf(infile,widths=ws,header=9, nrows=31, keep_default_na = False)
    df = df.drop('Day', 1)
    df = np.array(df.T)
    df = df[df != '']
    data = pd.DataFrame([])
    data['Discharge'] = df
    data = data.set_index(pd.date_range(year, periods=len(data), freq='D'),
                            drop=True, append=False, inplace=False, verify_integrity=False)
    new = pd.DataFrame([])
    all_ = new.append(data)
    print all_

选中此example

答案 1 :(得分:1)

如果我的问题是正确的,那么您正在尝试选择礼品卡的某些子集,使其余额总和尽可能接近orderTotal,但仍然小于或等于{{1 }}。在给定的情况下,最好的选择是给用户85卡,因为没有其他组合对我来说似乎更好。

可悲的是,仅仅通过直接使用LINQ就无法解决这个问题。如果这不是NP难问题,请尝试使用一些动态算法。