Как я могу сгруппировать в linq по количеству элементов или по совокупной сумме одновременно? - PullRequest
0 голосов
/ 28 мая 2020

Связанные Linq TakeWhile в зависимости от суммы (или совокупности) элементов

Что мне нужно сделать, так это разбить список на группы, меньшие, чем заданное количество элементов, а также с общий размер меньше указанной c цифры. В частности, это связано с ограничениями действия Power Automate Sharepoint Extract Folder на 100 файлов и размером менее 314 572 800 байт.

Мой исходный список содержит объекты, описывающие файлы в zip-архиве с свойство CompressedSize, и сейчас я делаю следующее:

Dim i = 0
Do
    i += 1
    currentSize += entries(i).CompressedSize
Loop Until i = entries.Count - 1 Or target.Count >= MaxZipFiles Or currentSize >= MaxZipBytes

Затем я могу Take i-1 элементов, чтобы получить первую группу Skip i-1, чтобы получить остаток и вызвать функция рекурсивно.

Должен быть способ сделать это.

1 Ответ

1 голос
/ 28 мая 2020

Я не очень хорошо разбираюсь в Visual Basi c, но вот пример C#, который должен делать то, что вам нужно.

const int maxCount = 100;
const long maxSize = 314572800;

var groups = new List<List<Item>>();

var nextGroup = new List<Item>();

foreach (var item in entries) 
{
    if (nextGroup.Count > maxCount 
        || nextGroup.Sum(x => x.CompressedSize) > maxSize) 
    {
        groups.Add(nextGroup);
        nextGroup = new List<Item>();
    }   
    nextGroup.Add(item);
}

groups.Add(nextGroup);

Я не думаю, что существует более простой способ LINQ сделайте это с помощью GroupBy.

Рекурсия может вызвать переполнение стека для этого и не кажется необходимым.

Вы можете захотеть инкапсулировать это в новый метод расширения в стиле LINQ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...