我在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.
如果有人能指出我正确的方向,我会非常感激!
答案 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";