public static class Ext
{
public static IEnumerable<string> Chunk(this string str, int chunkSize)
{
return Enumerable.Range(0, (int)Math.Ceiling((double)str.Length / chunkSize))
.Select(i => str.Substring(i * chunkSize, Math.Min(chunkSize, str.Length - (i * chunkSize))));
}
public static string Join(this IEnumerable<string> src, string delimiter)
{
return String.Join(delimiter, src);
}
}
public class Test
{
public static void Main()
{
Console.WriteLine("1234567890".Chunk(3).Join("-"));
}
}
Учитывая ленивость Linq и неизменямость строк данное решение будет явно оптимальнее, да и визуально понятнее.