Например, у меня есть список предметов
<list1,50>
<list2,30>
<list3,10>
<list4,70>
<list5,40>
<list6,5>
и maxBatchCount как 50:
Пакетная обработка приведет к: (одна партия может иметь максимальное количество, равное 50, если это возможно)
Batch 1 : <list1,50>
Batch 2 : <list2,30>,<list3,10>,<list6,5>
Batch 3 : <list4,70>
Batch 4 : <list5,40>
[UPDATE]
Я написал этот небольшой фрагмент кода, который работает, но все еще нуждается в помощи для его дальнейшей оптимизации.
class Items {
public int subItemCount { get; set; }
}
static void Main(string[] args)
{
LinkedList<Items> allItems = new LinkedList<Items>();
allItems.AddFirst(new Items() { subItemCount = 50 });
allItems.AddLast(new Items() { subItemCount = 30 });
allItems.AddLast(new Items() { subItemCount = 10 });
allItems.AddLast(new Items() { subItemCount = 70 });
allItems.AddLast(new Items() { subItemCount = 40 });
allItems.AddLast(new Items() { subItemCount = 5 });
int maxCount = 50;
List<List<Items>> batches = BatchItems(allItems, maxCount);
}
private static List<List<Items>> BatchItems(LinkedList<Items> allItems, int maxCount)
{
List<List<Items>> allBatches = new List<List<Items>>();
while (allItems.Where(e=>e.subItemCount<=maxCount).Count()>0)
{
int count = 0;
var firstNode = allItems.First;
while (count < maxCount && firstNode!=null)
{
List<Items> batch = new List<Items>();
while(firstNode!=null)
{
if (count + firstNode.Value.subItemCount <= maxCount)
{
count += firstNode.Value.subItemCount;
batch.Add(firstNode.Value);
var deleteNode = firstNode;
firstNode = firstNode.Next;
allItems.Remove(deleteNode);
}
else
firstNode = firstNode.Next;
}
allBatches.Add(batch);
}
}
foreach (var item in allItems)
{
allBatches.Add(new List<Items>() { item });
}
return allBatches;
}
This code will give me 4 Batches:
Batch 1 : List<Items>(){ {Item = 50}}
Batch 2: List<Items>(){ {Item = 30},{Item = 10},{Item = 5}}
Batch 3: List<Items>(){ {Item = 40}}
Batch 4: List<Items>(){ {Item = 70}}
Можно ли это оптимизировать дальше?