Размещение инлайн кнопок по рядам

возникла следующая проблема: У меня есть код генерирующий лист с кнопками:

public static List<InlineKeyboardButton> GenButtons(List<Cakes> cakes)
{
    List<InlineKeyboardButton> buttons = new List<InlineKeyboardButton>();

    foreach (var c in cakes)
    {
        buttons.Add(InlineKeyboardButton.WithCallbackData(c.name, $"{c.id}"));
    }

    return buttons;
}

И соответственно, в основном коде есть его преобразование:

List<InlineKeyboardButton> buttons = new List<InlineKeyboardButton>();
buttons = GenButtons(cakes);

InlineKeyboardMarkup inlineKeyboard = buttons.ToArray();

Но если я после, отправлю сообщение с этой клавиатурой, бот мне на ответе выдаст нечто..Он все кнопки запихивает в один ряд, что усложняет чтение и использование самих кнопок.

Как мне сделать так, что бы каждая кнопка была в отдельном ряду? Или две кнопки в ряду, не суть важно. Знаю, что нужен еще один массив, но как его реализовать совсем непонятно..

Класс листа Cakes

public class Cakes
{
    public uint id;
    public string name;
    public int count;
    public int cost;
    public string description;
}

Json обьект как пример класса:

[{"id":1,"name":"Карамельный торт","count":0,"cost":150,"description":"Шоколадный бисквит, хрустящий слой, шоколадный крем-чиз на сливках, карамель с арахисом."},{"id":2,"name":"Макарунс","count":0,"cost":90,"description":"Французское кондитерское изделие из яичных белков и мендальной муки.  "},{"id":3,"name":"Маковый торт","count":-1,"cost":160,"description":"Маковый бисквит, крем-чиз на слоеном масле, цитрусовый курд."},{"id":4,"name":"Медовик Классический","count":-5,"cost":160,"description":"Классические медовыые коржи, сметанный крем. "},{"id":5,"name":"Медовик Малиновый","count":1,"cost":180,"description":"Классические медовые коржи, сметанный крем, с добавлением малины."},{"id":6,"name":"Мраморное печенье","count":0,"cost":40,"description":"Ароматная выпечка для любителей всего шоколадного."},{"id":7,"name":"Наполеон Square (Ponpon)","count":-2,"cost":180,"description":"Слоеное тесто, заварной крем Патисьер, натуральные ягоды для украшения. "},{"id":8,"name":"Наполеон Triangle (Tartin)","count":0,"cost":180,"description":"Слоеное тесто, заварной крем Патисьер, натуральные ягоды для украшения."}]

Ответ бота: введите сюда описание изображения


Ответы (1 шт):

Автор решения: aepot

Для представления кнопок в несколько рядов используется не массив, а массив массивов, или его еще называют "зубчатый" массив.

public static InlineKeyboardButton[][] GenerateButtons(List<Cakes> cakes, int buttonsPerRow = 0)
{
    var data = cakes.Select(x => InlineKeyboardButton.WithCallbackData(c.name, $"{c.id}"));
    if (buttonsPerRow == 0)
        return new InlineKeyboardButton[][] { data.ToArray() };
    else
        return data.Chunk(buttonsPerRow).Select(c => c.ToArray()).ToArray();
}

В одну линию

InlineKeyboardMarkup inlineKeyboard = GenerateButtons(cakes);
[][][][][]

Вертикальной стопкой

InlineKeyboardMarkup inlineKeyboard = GenerateButtons(cakes, 1);
[]
[]
[]
[]
[]

По две в каждом ряду, в последнем - сколько осталось

InlineKeyboardMarkup inlineKeyboard = GenerateButtons(cakes, 2);
[][]
[][]
 []
→ Ссылка