我经常需要采用ASP.NET CheckBoxList和格式将所选值作为字符串插入到电子邮件中。遍历选定的复选框,获取值,然后将它们添加到带有“,”分隔符的StringBuilder中是很简单的,但是Count属性返回列表总数中的项目数,而不是实际选择的项目数。因此,很难知道何时到达最后一个项目,最后您最终会流浪“,”。
我已经尝试了几种解决此问题的方法。最近我一直在做这样的事情:
private string ConcatenateCheckBoxListItems()
{
StringBuilder sb = new StringBuilder();
char[] characters = new char[] {" ", ","};
String trimmedString;
foreach (ListItem item in MyList)
{
sb.Append(item.Value + ", ");
}
trimmedString = sb.ToString().TrimEnd(characters);
return trimmedString;
}
但这绝对是笨拙的。我尝试过的各种for循环方法也是如此。对更清洁的实施有何建议?
#1 楼
这还不够吗?private string ConcatenateCheckBoxListItems()
{
return string.Join(", ", from item in MyList select item.Value);
}
评论
\ $ \ begingroup \ $
酷,我怎么不知道那个。 :O :)
\ $ \ endgroup \ $
–史蒂文·杰里斯(Steven Jeuris)
2011-3-3在16:42
\ $ \ begingroup \ $
@Steven .NET Framework就是这样。你不可能一无所知。你只知道你必须知道的。这就是为什么存在这样的网站。
\ $ \ endgroup \ $
– pdr
2011-3-3在16:46
\ $ \ begingroup \ $
我绝对喜欢这个网站。是的,那是完美的,紧凑的,优雅的……我每天都感觉像是一个新手。 :)
\ $ \ endgroup \ $
–乔什·伯爵
2011年3月3日在17:30
\ $ \ begingroup \ $
@thedev不,但是可以很容易地扩展它。只需在选择后更改位即可替换逗号item.Value.Replace(“,”,@“ \,”)或将字符串括在引号item.Value.Contains(“,”)中? string.Format(@“”“ {0}”“”,item.Value):item.Value。无论您需要什么
\ $ \ endgroup \ $
– pdr
2011年3月3日18:23
\ $ \ begingroup \ $
Python?在我的C#中?认真地说,我不知道您可以在C#中进行这种向导。好答案。
\ $ \ endgroup \ $
–汉弗莱·鲍嘉(Humphrey Bogart)
2011年3月3日在21:33
#2 楼
为什么不使用string.Join()
?var result = string.Join(", ", MyList.Items.Select(i => i.Value));
评论
\ $ \ begingroup \ $
我非常喜欢以内联方式执行此操作,而不是像采用已接受的答案那样将其包装。
\ $ \ endgroup \ $
–约翰·拉森(Johan Larsson)
2015年9月18日23:59
#3 楼
string.Join()
是一个很好的答案,但是我更喜欢创建一个扩展方法:namespace StringExtensions
{
static class _
{
public static string JoinString<T>(this IEnumerable<T> source, string seperator = "")
{
return string.Join(seperator, source);
}
}
}
这样使用:
return MyList.Select(i => i.Value).JoinString(", ");
(我使用的是组织扩展方法的非常规方法,您可以在这里阅读有关内容:http://jbazuzicode.blogspot.com/2009/01/way-to-manage-extension-methods-in -c.html)。
评论
\ $ \ begingroup \ $
我有一个更加非常规的方法,我将它们放在相应的System命名空间中。 :)无需添加用法。我仍在决定是否要保留这种做法。
\ $ \ endgroup \ $
–史蒂文·杰里斯(Steven Jeuris)
11 Mar 4 '11 at 13:52
\ $ \ begingroup \ $
我更喜欢在扩展方法中隐藏实用程序功能的概念。 @Steven-我从没想过将扩展方法放在系统名称空间中+1
\ $ \ endgroup \ $
–杰夫·弗里茨(Jeff Fritz)
2011-3-5 14:04
\ $ \ begingroup \ $
@StevenJeuris那个线程让我癌症
\ $ \ endgroup \ $
– DLeh
2014-2-27在20:21
#4 楼
正如pdr所指出的,最好是使用String.Join
,而不是像我之前所说的那样自己做。请执行以下操作? private string ConcatenateCheckBoxListItems()
{
StringBuilder sb = new StringBuilder();
for ( int i = 0; i < MyList.Items.Count; ++i )
{
ListItem item = MyList.Items[ i ];
sb.Append( item.Value );
if ( i < MyList.Items.Count - 1 )
{
sb.Append( ", " );
}
}
return sb.ToString();
}
更新:
作为旁注,我知道很容易
很快失去对
的概述用这样的代码意图。这就是为什么
我一直在研究一个实验性的
类,该类允许进行
以下的操作。仍在决定我是否喜欢此解决方案。 :)没经常使用过。
评论
\ $ \ begingroup \ $
这类似于我尝试过的其他方法。在这种情况下,我要使用的MyList中的项目数与所选项目的数不同。否则,我只是重复整个CheckBoxList的值。
\ $ \ endgroup \ $
–乔什·伯爵
2011年3月3日在17:35
\ $ \ begingroup \ $
@JoshEarl:在未排除未选中项目的其他示例中,我没有看到任何检查,在您的示例中也没有?
\ $ \ endgroup \ $
–史蒂文·杰里斯(Steven Jeuris)
2011-3-3在17:44
\ $ \ begingroup \ $
@Steven对不起,我的问题中描述了未选中的项目,但是为了简单起见,我没有在代码中包含该部分。
\ $ \ endgroup \ $
–乔什·伯爵
2011年3月4日在12:58
\ $ \ begingroup \ $
@JoshEarl:没问题,但是您确实了解,所选项目的数量无关紧要吗? :)计数始终是已选择和未选择项目的总数。
\ $ \ endgroup \ $
–史蒂文·杰里斯(Steven Jeuris)
2011年3月4日13:06
\ $ \ begingroup \ $
@Steven好吧,如果您不想在最后选择的项目之后添加“,”,则很重要。如果您只是遍历计数而又不知道何时到达最后一个选定的项目,则最后一个项目之后会出现“,”,不是吗?那就是我试图用愚蠢的弦装饰解决的问题。
\ $ \ endgroup \ $
–乔什·伯爵
2011-3-4在16:32
评论
这个内置功能可以满足您的需求吗?尽管有答案,但在此代码中,定界符应为字符串,并且修剪结尾应调用delimiter.ToCharArray(),以使维护工作更轻松一点。