林克分成了等分的小组

本文关键字:林克 | 更新日期: 2023-09-27 17:58:04

我目前正在从事一个项目,其中一个要求是能够通过Web服务向供应商下订单。一整天,各种各样的人都会把商品添加到购物袋中,然后在工作日结束时下单。

当订单交付时,仓库里的人会打开商品包装,并检查匹配的送货单。

为了让这项工作更容易,他们希望将订单分成更小的子订单,每个订单最多15件。

这是我第一次尝试攻击:

var groupingBySupplierID = shoppingBag.Where(x => x.SelectedSupplier != null).GroupBy(x => x.SelectedSupplier.SupplierID))
var groupedListOf15Items = groupingBySupplierID                        
                        .Select((item, index) => new {item, index}) //Items with the index in the list
                        .GroupBy(x => x.index/15) //Integerdivison on the index.. 1..14/15 == 0. 15..29/15 == 1 and so on
                        .Select(x => x.Select(y => y.item)); //Get the items back out from the groups

然而,如果有17个项目,我会得到一个计数为15的IEnumerable<IEnumerable<ShoppingBagItem>>,然后得到一个包含2个项目的1。

理想情况下,我希望返回X个列表,每个列表中的项目数量均匀分布,在本例中为2,计数分别为9和8。

关于我如何才能做到这一点,有什么想法吗?

林克分成了等分的小组

在我看来,你应该先在这里做一些数学运算。。。找到您需要的组数(div),然后将总数除以这个,就可以看到每个组有多少项。现在在您的组中使用这个值(而不是15)通过:

    int maxItemsPerGroup = 15;
    int totalItems = 17;
    // some math - could probably be cleaner
    int groups = totalItems / maxItemsPerGroup;
    if ((totalItems % maxItemsPerGroup) != 0) groups++;
    int itemsPerGroup = totalItems / groups;
    if ((totalItems % groups) != 0) itemsPerGroup++;

以CCD_ 2分组。