将字符串列表连接到组合的定界字符串中的最佳方法是什么。我主要关心何时停止添加定界符。我将使用C#作为示例,但是我希望这与语言无关。
编辑:我没有使用StringBuilder使代码稍微简单些。
使用For循环
for(int i=0; i < list.Length; i++) { result += list[i]; if(i != list.Length - 1) result += delimiter; }
使用For循环设置之前的第一项
result = list[0]; for(int i = 1; i < list.Length; i++) result += delimiter + list[i];
在您事先不知道列表长度的情况下,这些方法不适用于IEnumerable
使用foreach循环
bool first = true; foreach(string item in list) { if(!first) result += delimiter; result += item; first = false; }
foreach循环的变化
从乔恩的解决方案
StringBuilder builder = new StringBuilder(); string delimiter = ""; foreach (string item in list) { builder.Append(delimiter); builder.Append(item); delimiter = ","; } return builder.ToString();
使用迭代器
再次来自乔恩
using (IEnumerator<string> iterator = list.GetEnumerator()) { if (!iterator.MoveNext()) return ""; StringBuilder builder = new StringBuilder(iterator.Current); while (iterator.MoveNext()) { builder.Append(delimiter); builder.Append(iterator.Current); } return builder.ToString(); }
还有哪些其他算法?
由于不同的语言和平台对字符串的处理方式不同,并且无法为连接字符串列表提供不同级别的内置支持,因此在此处无法给出与语言无关的答案。您可以使用两种不同的语言编写 几乎完全相同的 代码,而用一种语言编写则效果很好,而用另一种语言编写则效果很差。
在C#中,您可以使用:
除第一个项目外,这将在所有项目前 加 一个逗号。类似的代码在Java中也是不错的。
编辑:这是另一种选择,有点像伊恩(Ian)后来的回答,但正在研究将军 IEnumerable<string>。
IEnumerable<string>
// Change to IEnumerator for the non-generic IEnumerable using (IEnumerator<string> iterator = list.GetEnumerator()) { if (!iterator.MoveNext()) { return ""; } StringBuilder builder = new StringBuilder(iterator.Current); while (iterator.MoveNext()) { builder.Append(delimiter); builder.Append(iterator.Current); } return builder.ToString(); }
编辑原始答案后将近5年…
在.NET 4中,string.Join相当明显地过载了。有一个IEnumerable<T>自动调用ToString的重载,并且有一个重载IEnumerable<string>。因此,无论如何,您都不需要.NET之上的代码。
string.Join
IEnumerable<T>
ToString