I have many examples of using LINQ, how to split a list into a list according to the maximum elements in each list. But in this case, I am interested in diving sub-lists using sizemb as the weight - with a maximum file size in the list of 9mb.
public class doc { public string file; public int sizemb; } var list = new List<doc>() { new doc { file = "dok1", sizemb = 5 }, new doc { file = "dok2", sizemb = 5 }, new doc { file = "dok3", sizemb = 5 }, new doc { file = "dok4", sizemb = 4 }, }; int maxTotalFileSize = 9;
The above list should be divided into 3 lists. If any "files" are more than 9 mb, they should be in their own list.
I made a non-LINQ version here:
var lists = new List<List<doc>>(); foreach (var item in list) { //Try and place the document into a sub-list var availableSlot = lists.FirstOrDefault(p => (p.Sum(x => x.sizemb) + item.sizemb) < maxGroupSize); if (availableSlot == null) lists.Add(new List<doc>() { item }); else availableSlot.Add(item); }
bluee source share