нужна помощь для выполнения пакетирования на моем наборе данных на основе подсчета элементов в C # - PullRequest
0 голосов
/ 07 сентября 2018

Например, у меня есть список предметов

<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}}

Можно ли это оптимизировать дальше?

...