well, you can use the following my class that I have written with help of community to split List
into parts. To read about main logic of splitting you can check How to write a generic list method that will cast at runtime sfdcfox's answer
public with sharing class Lists {
public static List<List<Object>> doPartions(List<Object> records, Integer size, Type destType){
checkNotNull(records);
checkArgument(size > 0);
checkNotNull(destType);
return new Partition(records, size, destType).doPartition();
}
private static void checkNotNull(Object reference) {
if (reference == null) {
throw new NullPointerException();
}
}
private static void checkArgument(Boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
}
}
private class Partition{
private List<Object> items;
private Integer splitSize;
private Type destType;
Partition(List<Object> records, Integer size, Type destType){
this.items = records;
this.splitSize = size;
this.destType = destType;
}
List<List<Object>> doPartition(){
List<List<Object>> result = (List<List<Object>>)destType.newInstance();
List<Object> protoList = items.clone();
protoList.clear();
List<Object> tempList = protoList.clone();
Integer index = 0, count = 0, size = items.size();
while(index < size) {
tempList.add(items.get(index++));
++count;
if(count == splitSize) {
result.add(tempList);
tempList = protoList.clone();
count = 0;
}
}
if(!tempList.isEmpty()) {
result.add(tempList);
}
return result;
}
}
public class IllegalArgumentException extends Exception {}
}
unit-tests
@isTest
private class ListsTest {
@isTest
static void testCorrectPartions(){
List<Integer> records = new List<Integer> {
1, 2, 3, 4, 5
};
Test.startTest();
List<List<Integer>> actual = (List<List<Integer>>) Lists.doPartions(records, 2, List<List<Integer>>.class);
Test.stopTest();
System.assertEquals(3, actual.size(), 'Incorrect number of partions');
Integer tempNumber = 1;
for(List<Integer> itemsActual :actual){
for(Integer numb :itemsActual){
System.assertEquals(tempNumber, numb, 'Order of elements isn\'t saved');
++tempNumber;
}
}
}
}
Usage in your case
List<List<Custom__c>> partionLists = (List<List<Custom__c>>) Lists.doPartions(mainLst, 5000, List<List<Custom__c>>.class);