patterncsharpModerate
Adding N characters to a string
Viewed 0 times
charactersstringadding
Problem
I need to prepend N spaces to a string to make it 10 characters in length. I came up with the following method, but since it is going to be called often, I want to ensure it is optimized. Could this be made more efficient?
public static string PrependSpaces(string str)
{
StringBuilder sb = new StringBuilder();
sb.Append(str);
for (int i = 0; i < (10 - str.Length); i++)
{
sb.Insert(0, " ");
}
return sb.ToString();
}Solution
If you need to prepend a number of characters to a string you might consider String.PadLeft().
For example:
Will produce:
On the efficiency of your example,
EDIT As svick suggested, Append(char, repeat) is simpler and faster on the order of the native Pad methods:
Which when tested with this:
returns this (benchmarks for prepending 1000 characters):
for prepending 10 characters:
For example:
string str = "abc123";
Console.WriteLine(str);
str = str.PadLeft(10);
Console.WriteLine(str);Will produce:
abc123
abc123On the efficiency of your example,
StringBuilder.Append() is more efficient than StringBuilder.Insert(), so you might try something like:public static string PrependSpaces2(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < (10 - str.Length); i++)
{
sb.Append(" ");
}
sb.Append(str);
return sb.ToString();
}EDIT As svick suggested, Append(char, repeat) is simpler and faster on the order of the native Pad methods:
public static string PrependSpaces3(string str)
StringBuilder sb = new StringBuilder();
if((NUM - str.Length) > 0)
{
sb.Append(' ', (NUM - str.Length));
}
sb.Append(str);
return sb.ToString();
}Which when tested with this:
string str = "abc123";
Console.WriteLine("str: " + str);
int iterations = 100000;
string result = string.Empty;
Stopwatch s1 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result = PrependSpaces(str);
}
s1.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces took: {0:0.00 ms}", s1.Elapsed.TotalMilliseconds);
string result2 = string.Empty;
Stopwatch s2 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result2 = PrependSpaces2(str);
}
s2.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces2 took: {0:0.00 ms}", s2.Elapsed.TotalMilliseconds);
string result3 = string.Empty;
Stopwatch s3 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result3 = str.PadLeft(NUM, ' ');
}
s3.Stop();
Console.WriteLine(iterations + " calls to String.PadLeft(" + NUM + ", ' ') took: {0:0.00 ms}", s3.Elapsed.TotalMilliseconds);
string result4 = string.Empty;
Stopwatch s4 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result4 = PrependSpaces3(str);
}
s4.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces3 took: {0:0.00 ms}", s3.Elapsed.TotalMilliseconds);returns this (benchmarks for prepending 1000 characters):
str: abc123
100000 calls to PrependSpaces took: 20190.16 ms
100000 calls to PrependSpaces2 took: 1025.87 ms
100000 calls to String.PadLeft(1000, ' ') took: 84.32 ms
100000 calls to PrependSpaces3 took: 84.32 msfor prepending 10 characters:
100000 calls to PrependSpaces took: 31.02 ms
100000 calls to PrependSpaces2 took: 11.41 ms
100000 calls to String.PadLeft(10, ' ') took: 4.53 ms
100000 calls to PrependSpaces3 took: 4.53 msCode Snippets
string str = "abc123";
Console.WriteLine(str);
str = str.PadLeft(10);
Console.WriteLine(str);abc123
abc123public static string PrependSpaces2(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < (10 - str.Length); i++)
{
sb.Append(" ");
}
sb.Append(str);
return sb.ToString();
}public static string PrependSpaces3(string str)
StringBuilder sb = new StringBuilder();
if((NUM - str.Length) > 0)
{
sb.Append(' ', (NUM - str.Length));
}
sb.Append(str);
return sb.ToString();
}string str = "abc123";
Console.WriteLine("str: " + str);
int iterations = 100000;
string result = string.Empty;
Stopwatch s1 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result = PrependSpaces(str);
}
s1.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces took: {0:0.00 ms}", s1.Elapsed.TotalMilliseconds);
string result2 = string.Empty;
Stopwatch s2 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result2 = PrependSpaces2(str);
}
s2.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces2 took: {0:0.00 ms}", s2.Elapsed.TotalMilliseconds);
string result3 = string.Empty;
Stopwatch s3 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result3 = str.PadLeft(NUM, ' ');
}
s3.Stop();
Console.WriteLine(iterations + " calls to String.PadLeft(" + NUM + ", ' ') took: {0:0.00 ms}", s3.Elapsed.TotalMilliseconds);
string result4 = string.Empty;
Stopwatch s4 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
result4 = PrependSpaces3(str);
}
s4.Stop();
Console.WriteLine(iterations + " calls to PrependSpaces3 took: {0:0.00 ms}", s3.Elapsed.TotalMilliseconds);Context
StackExchange Code Review Q#36391, answer score: 14
Revisions (0)
No revisions yet.