这是我到目前为止的循环
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
//Code goes here
}
}
复选框都包含一周中几天的文本值。周一,周二等。
我希望最终结果是一个看起来像“星期一,星期二和星期五”的字符串,具体取决于是否检查该框。
循环将更改bool,以便知道是否至少选中了一个复选框。这将在if语句中用于显示生成的字符串之后,如果没有选中,则不显示字符串。我认为这意味着如果有帮助的话,字符串的开头是什么并不重要。
我希望我已经清楚了。如果您需要更多细节,请询问。
提前谢谢。
当前代码:
string days = "*";
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
days += "#" + chk.Text;
}
}
days = days.Insert(days.LastIndexOf('#'), " and ");
days = days.Remove(days.LastIndexOf('#'), 1);
days = days.Replace("#", ", ");
days = days.Replace("* and ", "");
days = days.Replace("*, ", "");
有人可以看到这个有什么问题吗?
答案 0 :(得分:3)
我能想到的最简单方法是将foreach
更改为for
循环。我目前没有打开IDE,所以我不能仔细检查抓取控件但是一旦你有List<CheckBox>
你可以使用(没必要,只是更直接的想法)你可以得到类似的东西:
//ckBoxes is our List<CheckBox>
for(int i = 0; i < ckBoxes.Count; i++)
{
StringBuilder listBuilder = new StringBuilder;
if(i == ckBoxes.Count -1)
{
listBuilder.Append("and " + dayOfWeek)
}
else listBuilder.Append(dayOfWeek + ", ");
}
这非常非常粗糙,在使用之前需要大量清洁,但它应该让你走上一条有效的道路。
答案 1 :(得分:1)
试试这个。
var days = gpbSchecule.Controls.OfType<CheckBox>()
.Where(x => x.Checked)
.Select(x => x.Text)
.ToArray();
这将为您提供一个仅包含已检查日期的数组,您可以使用它来确定是否需要“和”,并对其应用简单的字符串方法。
从这里开始,按@Garo推荐使用string.Join()
。
答案 2 :(得分:0)
使循环将跟踪显示用户所需的所有日期(进入List或其他)。然后,在循环之后,使用string.Join将第一个N-1项与“,”组合,然后再组合第二个字符串。加入最后一项“and”。
答案 3 :(得分:0)
最简单的方法是使用两个循环。第一个构建已检查控件的列表。然后遍历刚刚构建的列表并执行字符串构建器命令。
List<CheckBox> checked = new List<CheckBox>();
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
checked.Add(chk);
}
}
for(int i = 0; i < checked.Count; i++)
{
if (i == checked.Count-1))
{
//write for last element
}
else
{
//write for all other elements
}
}
答案 4 :(得分:0)
这样的事情应该有效:
var days = new List<string>();
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
days.Add(chk.Text);
}
}
string daysString = "";
if (days.Count == 1)
{
daysString = days[0];
}
else if (days.Count > 1)
{
daysString =
string.Join(", ", days.Take(days.Count - 1)) +
" and " +
days[days.Count - 1];
}
答案 5 :(得分:0)
有点丑陋的解决方案,但应该有用。
string result = "";
string nextDay = null;
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (nextDay != null) {
if (result.length() > 0) {
result += ", " + nextDay;
} else {
result = nextDay;
}
nextDay = null;
}
if (chk.Checked)
{
//Code goes here
nextDay = chk.text; // Your text here Monday, Tuesday, ...
}
}
if (nextDay != null) {
if (result.length() > 0) {
result += " and " + nextDay;
} else {
result = nextDay;
}
nextDay = null;
}
答案 6 :(得分:0)
// change this into a collection of your checked group boxes
string[] threeStrings = new string[] { "Joe", "Jim", "Robert" };
StringBuilder newString = new StringBuilder();
// iterate over your array here - strings used to simplify example
for (int i = 0; i < threeStrings.Length; i++)
{
if (i < threeStrings.Length - 1)
{
newString.Append(threeStrings[i]);
newString.Append(", ");
}
else
{
newString.Append(" and ");
newString.Append(threeStrings[i]);
}
}
Console.WriteLine(newString.ToString());
答案 7 :(得分:0)
这是另一种解决方案。我放了一些Init代码来测试它。
private List<CheckBox> _checkBoxes;
private void Test()
{
Init();
List<CheckBox> checkedCheckBoxes = _checkBoxes.Where(cb => cb.Checked == true).ToList();
StringBuilder str = new StringBuilder();
string delimiter = String.Empty;
for (int i = 0; i < checkedCheckBoxes.Count; i++)
{
str.Append(delimiter);
str.Append(checkedCheckBoxes[i].Name);
if (i != checkedCheckBoxes.Count)
{
if (i == checkedCheckBoxes.Count - 2)
delimiter = " and ";
else
delimiter = ", ";
}
}
Console.WriteLine(str.ToString());
Console.ReadLine();
}
private void Init()
{
_checkBoxes = new List<CheckBox>();
string[] days = new string[7] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
Random r = new Random();
foreach (string day in days)
{
CheckBox cb = new CheckBox();
cb.Name = day;
cb.Checked = Convert.ToBoolean(r.Next(0, 2));
_checkBoxes.Add(cb);
}
}
答案 8 :(得分:0)
我投票支持AllenG,但你也可以这样做:
// First build a string of days separated by a coma
string days = String.Empty;
foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
if (!String.IsNullOrEmpty(days))
days += ", ";
days += chk.Text;
}
}
// Then replace the last coma with "and"
int lastComaIndex = days.LastIndexOf(',');
if (lastComaIndex >= 0)
days = days.Substring(0, lastComaIndex) + " and " + days.Substring(lastComaIndex + 2);
答案 9 :(得分:0)
这是我的看法:
var darr = (from checkbox in gpbSchecule.Controls.OfType<CheckBox>()
where checkbox.Checked
select checkbox.Text)
.ToArray();
string days = "";
if (darr.Length > 0)
{
days = string.Join(", ", darr.Take(darr.Length - 1));
if (darr.Length > 1)
days += " and ";
days += darr[darr.Length - 1];
}