Наиболее эффективным и масштабируемым объемом памяти будет использование 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 ");