2010-08-09 34 views
2

这里是环我到目前为止C# - 如何产生字符串“和”在正确的位置

foreach (CheckBox chk in gpbSchedule.Controls.OfType<CheckBox>()) 
       { 
        if (chk.Checked) 
        { 
         //Code goes here 
        } 
       } 

的复选框都有的星期几文本值。星期一,星期二等。

我想最终的结果是一个字符串,看起来像“星期一,星期二和星期五”取决于是否检查框。

循环将更改布尔值,以便知道是否至少选中了一个复选框。这将被用在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

我记得在什么地方[埃里克斯有这样的事情博客](http://blogs.msdn.com/b/ericlippert/),但我找不到它。 (这是一个挑战,你应该发表你的答案作为评论) – Oliver 2010-08-09 14:18:56

回答

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 + ", "); 
} 

这是非常,非常粗糙,而且需要大量的清洗然后再使用它,但它应该把你一个可行的路径上。

+0

你甚至不应该真的需要一个列表。您可以使用Linq在单一查询中获取IQueryable或类似构造,以获得您需要的计数。 – 2010-08-09 14:51:38

+0

是的,我提到过。出于某种原因,我发现清单工作更容易。这可能是因为每次我做了类似的事情时,我最终都需要一个List ,所以在开始时将它放在列表中更容易。 – AllenG 2010-08-09 14:54:10

0

使其成为循环将跟踪所有需要显示用户的日子(进入List或其他)。然后,在循环之后,使用string.Join将第一个N-1项目与“,”和第二个字符串合并。使用“and”加入最后一个项目。

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 
    } 
} 
+0

-1:2循环不是必需的,只会增加完成的工作。此外,除了填充列表以获取计数之外,您不使用第一个循环来完成任何操作。有更简单的方法来实现这一点。 – 2010-08-09 14:50:14

+0

大部分提供的解决方案都是通过使用为您构建列表的api隐藏第一个循环。我没有写出其他块的主体,但它应该很明显,涉及到获取该列表的索引处的对象。 – unholysampler 2010-08-09 15:10:35

+0

你对所有人都是对的解决方案。它们和你的一样循环。我已经标记了你的回答正确。虽然我认为我的答案好多了。 – 2010-08-12 11:04:08

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]; 
} 
1

尝试了这一点。

var days = gpbSchecule.Controls.OfType<CheckBox>() 
           .Where(x => x.Checked) 
           .Select(x => x.Text) 
           .ToArray(); 

这让你包含数组只检查天,你可以用它来确定是否“和”是必要的,并针对简单的字符串的方法。

从这里申请string.Join()的@Garo建议。

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; 
} 
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()); 
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); 
    } 
} 
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); 
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]; 
} 
相关问题