选中逗号分隔列表的复选框,带有单词"和"在C#的最后

时间:2014-05-23 04:48:01

标签: c# checkbox

我在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.

如果有人能指出我正确的方向,我会非常感激!

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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";