Помогите улучшить код создания клавиатуры для бота
Подскажите можно ли сделать код приведенный ниже более грамотно? .Net 6.0
public static ReplyKeyboardMarkup KeyboardMarkup()
{
var keyboard = new List <KeyboardButton[]> ();
List <string> arr = new();
//Добавляем строчки для теста
arr.Add("Key1");
arr.Add("Key2");
arr.Add("Key3");
//arr.Add("Key4");
//При четном arr выполняем код:
if (arr.Count % 2 == 0) {
//Заполняем keyboard данными из arr по 2шт
for (int i = 0; i < arr.Count; i += 2)
{
keyboard.Add(new KeyboardButton[] { arr[i], arr[i + 1] });
}
}
//При нечетном List arr выполняем код:
else
{
//Заполняем keyboard данными из arr по 2шт
for (int i = 0; i < arr.Count - 1; i += 2) {
keyboard.Add(new KeyboardButton[] { arr[i], arr[i + 1] });
}
//Т.к. выполняется код при нечетном кол-ве arr добавляем необработанное последнее значение arr
keyboard.Add(new KeyboardButton[] { arr.Last() });
}
return new(keyboard);
}
upd
using Telegram.Bot.Types.ReplyMarkups;
namespace CourseMarketBot
{
internal class GenMenu
{
public static ReplyKeyboardMarkup KeyboardMarkup()
{
List<KeyboardButton> arr = new();
//using var context = new Context();
//Это для моей БД
//foreach (var item in context.MenuItems)
// if (item.Status)
// arr.Add(item.Name);
//Для теста т.к. пример без подключения к БД
arr.Add("Key1");
arr.Add("Key2");
arr.Add("Key3");
//arr.Add("Key4");
return new(arr.Chunk(2).ToList()) { ResizeKeyboard = true };
}
}
}
Ответы (3 шт):
Автор решения: RusArt
→ Ссылка
В dotnet 6 появилась функция .Chunk(int size), которая преобразует последовательность как раз так, как вам надо.
keyboard = arr.Chunk(2).ToList();
Автор решения: Yotic
→ Ссылка
public static ReplyKeyboardMarkup KeyboardMarkup() => new(new List<string>(){"Key1", "Key2", "Key3",}.Chunk(2).ToList());
Автор решения: Qwertiy
→ Ссылка
List <string> arr = new(); //Добавляем строчки для теста arr.Add("Key1"); arr.Add("Key2"); arr.Add("Key3"); //arr.Add("Key4");
List <string> arr { "Key1", "Key2", "Key3", /* "Key4" */ };
Но вообще, при том, что строки задаются в самом методе, я не понимаю, зачем городить всю это логику. Можно ведь просто взять и полностью всё захардкодить - получится гораздо проще:
public static ReplyKeyboardMarkup KeyboardMarkup()
{
return new ReplyKeyboardMarkup
(
new List<KeyboardButton[]>
(
new KeyboardButton[] { "Key1", "Key2" },
new KeyboardButton[] { "Key3" },
)
);
}