是否有一种简单的方法可以从项目列表中创建逗号分隔的字符串,而无需在字符串的末尾添加额外的“,”?

我经常需要采用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循环方法也是如此。对更清洁的实施有何建议?

评论

这个内置功能可以满足您的需求吗?

尽管有答案,但在此代码中,定界符应为字符串,并且修剪结尾应调用delimiter.ToCharArray(),以使维护工作更轻松一点。

#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