Я не думаю, что вам нужно вмешиваться, вы можете просто использовать существующие функции LINQ для создания поисков
List<User> list = ... .OrderBy(u=>u.Name); //from db
ILookup<int, User> lookup = list.ToLookup(
u => (u.Name[0] - 63)/14,
u => new Dto { Id = u.Id, Name = u.Name }
);
Числа относятся к обработке char как int в таблице ascii, A, являющейся 65. Вычитая 63, A становится 2, L становится 13, Z становится 27. К тому же, деля на 14, мы уменьшаем это до 0 или 1 Теперь ваш поиск будет представлять собой список пользователей, проиндексированных по 0 или 1, где 0 соответствует AtoL. Если вы хотите, чтобы пользователи в указанном списке были отсортированы, вы можете вызвать OrderBy для них. Я сделал это с помощью математики, а не сравнения bool, чтобы вы могли изменить его на большее количество столбцов в будущем, просто изменив числа, но вы также можете использовать bool:
var lookup = list.ToLookup(
u => u.Name[0]<'M',
u => new Dto { Id = u.Id, Name = u.Name }
);
В этом поиске возвращается, индексированный по истине будет от А до L
Назначьте вашему категорированному Dto:
var x = new CatDto(){
aToL=lookup[true],
mToZ=lookup[false]
};
Обратите внимание, что это, в сочетании с любым другим ответом здесь, зависит от того, правильно ли отформатированы ваши имена с использованием символа ASCII в верхнем регистре в качестве первого символа. Если ваши имена не запутаны или не всегда начинаются таким образом, вам следует подумать делать такие вещи, как прописные буквы перед сравнением и т. д.