[转载]关于string.Join()的妙用与疑惑 – 我是你的猪 – 博客园.
String.Join 在指定 String 数组的每个元素之间串联指定的分隔符 String,从而产生单个串联的字符串。(来源于MSDN)
假设我有一分类表cat,包含id,name列
内容如下:
//id name |
//1 随笔 |
//2 文章 |
//3 新闻 |
如果想得到”随笔,文章,新闻“的结果,我会这么写(假设已经取得List<cat>):
StringBuilder sb = new StringBuilder();
int i = 0;
foreach (var item in cat)
{
sb.Append(cat.Name);
if (cat.Count != i)
{
sb.Append(“,“);
}
i++;
}
return sb.ToString();
foreach (var item in cat)
{
sb.Append(cat.Name);
if (cat.Count != i)
{
sb.Append(“,“);
}
i++;
}
return sb.ToString();
或者这种(需保证cat.Count>0):
StringBuilder sb = new StringBuilder();
foreach (var item in cat)
{
sb.Append(“,“);
sb.Append(cat.Name);
i++;
}
return sb.ToString().Substring(1);
{
sb.Append(“,“);
sb.Append(cat.Name);
i++;
}
return sb.ToString().Substring(1);
但是当有了string.Join之后,一切简单多了:
return string.Join(“,“, cat.Select(p=>p.Name).ToList());
PS.如果是List<string>的话,可以直接省略后面的.Select(p=>p.Name).ToList(),因为是实体List<cat>,所以需要指定需要遍历的列
这确实很方便,以前要5,6行的代码,现在一行就解决了.
于是我将这种方法大量使用在了我的MVC网站中,先看下最终效果:
首先,我跟上面一样,想循环得到一个分类列表:
string.Join(“,“, Model.Cats.Select(item => item.Name).ToList())
但是,这是在MVC的Razor页面,所以,我想生成的是带超链接的文字,那么应该这样做:
string.Join(“,“, Model.Tags.Select(item => Html.ActionLink(item.Name, “Index“, “Article“, new { t = item.Name }, new { title = string.Format(“查看 {0} 的全部文章“, item.Name) })).ToList())
但是发现运行之后变成了这样:
原来Html被转移了,看来需要使用下Html.Raw()方法,于是:
Html.Raw(string.Join(“,“, Model.Tags.Select(item => Html.ActionLink(item.Name, “Index“, “Article“, new { t = item.Name }, new { title = string.Format(“查看 {0} 的全部文章“, item.Name) })).ToList()))
最终,我们得到了一个超长的方法.
这是原来的方法:
@{int i = 0;}
@foreach (var item in Model.Categorys)
{
@Html.ActionLink(item.Name, “Index“, “Article“ , new { c = item.Url }, new { title =string.Format( “查看 {0} 的全部文章“,item.Name) })
@(++i == Model.Categorys.Count ? string.Empty : “,“)
}
@foreach (var item in Model.Categorys)
{
@Html.ActionLink(item.Name, “Index“, “Article“ , new { c = item.Url }, new { title =string.Format( “查看 {0} 的全部文章“,item.Name) })
@(++i == Model.Categorys.Count ? string.Empty : “,“)
}
我现在已经分不清string.Join()是精简了我的代码,还是复杂了我的代码了.不过确实要承认,在比较简单的情况下,string.Join()的确能减少我们很多的代码.
以上,欢迎拍砖