我目前正在从事一个项目,其中一个要求是能够通过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分组。