最节省内存和可扩展性的方法是使用StringBuilder
并预先计算最终字符串的长度以消除缓冲区重新分配。(这类似于String.Concat
方法的工作方式。)
public static string Join(string[] items, string separator, string lastSeparator) {
int len = separator.Length * (items.Length - 2) + lastSeparator.Length;
foreach (string s in items) len += s.Length;
StringBuilder builder = new StringBuilder(len);
for (int i = 0; i < items.Length; i++) {
builder.Append(items[i]);
switch (items.Length - i) {
case 1: break;
case 2: builder.Append(lastSeparator); break;
default: builder.Append(separator); break;
}
}
return builder.ToString();
}
使用方法:
string joined = Join(s, ", ", " or ");
一个有趣的解决方案是使用递归算法。对于数量较少的字符串,它运行良好,但在大规模情况下会遇到性能问题。
public static string Join(string[] items, int index , string separator, string lastSeparator) {
return items[index++] + (index == items.Length-1 ? lastSeparator + items[index] : separator + Join(items, index, separator, lastSeparator));
}
使用方法:
string joined = Join(s, 0, ", ", " or ");