c# - 如何在正确的位置使用'和'生成字符串

时间:2010-08-09 13:45:46

标签: c# string loops

这是我到目前为止的循环

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("*, ", "");

有人可以看到这个有什么问题吗?

10 个答案:

答案 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];
}