Установленные флажки в списке через запятую со словом «и» в конце на C #

1

У меня есть несколько флажков, расположенных внутри панели WinForms. Когда флажки отмечены, я хочу создать список, разделенный запятыми, но со словом "и" перед последним значением поля флажка.

Вот код, который у меня есть... который выполняется из одного обработчика событий, общего для всех флажков:

    string checkboxes = " ";
    foreach (Control c in MyPanel.Controls)
    {
        if (c is CheckBox && (c as CheckBox).Checked)
            checkboxes += (c as CheckBox).Text;
    }
    checkboxes = string.Join(", ", checkboxes.Take(checkboxes.Count() - 1)) + (checkboxes.Count() > 1 ? " and " : "") + checkboxes.LastOrDefault();
    Console.WriteLine(checkboxes + "are checked");

У меня есть следующие флажки:

_Item A
_Item B
_Item C
_Item D

Если, например, отмечены пункты A и B, я хочу, чтобы он выплюнул " Проверяются элементы A и B ".

Если отмечены пункты A, B и D... " Элемент A, пункт B и пункт D отмечены "

Однако, с моим текущим кодом, он делает что-то похожее на это:

I, t, e, m, A, I, t, e, m, B, I, t, e, m и D.

Если кто-то может указать мне в правильном направлении, я бы очень признателен!

Теги:
checkbox

2 ответа

2
Лучший ответ

Попробуй это:

string checkboxes = " ";
foreach (Control c in MyPanel.Controls)
{
    if (c is CheckBox && (c as CheckBox).Checked)
        checkboxes += (c as CheckBox).Text.Split().Last();
}
checkboxes=String.Concat(checkboxes.OrderBy(c => c);
checkboxes = string.Join(", ", checkboxes.Take(checkboxes.Count() - 1)) + (checkboxes.Length > 1 ? " and " : "") + checkboxes.LastOrDefault();
if (checkboxes.Length>1)
     checkboxes = checkboxes.Remove(0, 2);
Console.WriteLine("Items " + checkboxes + " are checked");
  • 0
    К сожалению, ваше предложение по-прежнему вводит ненужные запятые.
  • 0
    @Spencer: Какой вывод вы получаете с этим кодом?
Показать ещё 8 комментариев
1

Здесь выполняется бедный человек с использованием LINQ и String.Join. Это сначала добавляет "и" к последнему элементу, а затем просто объединяет результаты для создания списка, разделенного запятыми:

//get a list of the text of the checked checkboxes
var checkedNames = MyPanel.Controls.OfType<CheckBox>().Cast<CheckBox>()
    .Where(c => c.Checked).Select(c => c.Text).ToList();

//boundary cases
if(checkedNames.Count == 0)
    return "Nothing is checked";
else if(checkedNames.Count == 1)
    return checkedNames[0] + " is checked";    

//add an "and" to the last one
checkedNames[checkedNames.Count - 1] = "and " + checkedNames[checkedNames.Count - 1];

//join them up into a comma-separated list
return String.Join(" ,", checkedNames) + " are checked";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню