Count a Character in a StringBuilder?

  • Thread starter Thread starter coconet
  • Start date Start date
C

coconet

I am looking for the extreme-fastest way to count the occurence of a
"\t" character in a stringbuilder. I have a massive, dynamically
created one and need to count them without converting the whole thing
to a multimegabyte string and then splitting or something equally
horrid.

Thanks.
 
I am looking for the extreme-fastest way to count the occurence of a
"\t" character in a stringbuilder. I have a massive, dynamically
created one and need to count them without converting the whole thing
to a multimegabyte string and then splitting or something equally
horrid.

int CtabsInStringBuilder(StringBuilder sb)
{
int ctabs = 0;

foreach (char ch in sb.Chars)
{
if (ch == '\t')
{
ctabs++;
}
}

return ctabs;
}

I would be surprised if you could find a solution that performs
significantly better than that. It's not like there's some magic bullet
that can tell you the number of tab characters without actually looking at
each character in the string.

Pete
 
Hello,

To count the occurrence of the character '\t' in a string, I think it is
necessary to have one iteration of all the characters. That is to say, the
time complexity of the issue should be O(n), where n is the length of the
string. StringBuilder exposes a direct access to its characters with its
Chars property "char StringBuilder[int index]"
http://msdn2.microsoft.com/en-us/library/system.text.stringbuilder.chars(VS.
71).aspx. When I use Lutz Roeder's .NET Reflector to look into
System.Text.StringBuilder.Chars, I find that get_Chars is simply
implemented by "return this.m_StringValue[index];". Therefore, it should be
faster than converting StringBuilder to a string object first, then
counting the character.

Below is my code list that demonstrates how to count the character '\t'
with StringBuilder.Chars property. Please have a test, and see if it fits
your request.

int CountTab(StringBuilder builder)
{
int count = 0;
for (int i = 0; i < builder.Length; i++)
{
if (builder == '\t')
count++;
}
return count;
}

If you have any other questions or concerns, please feel free to let me
know.

Regards
Jialiang Ge ([email protected], remove 'online.')
Microsoft Online Community Support

==================================================
For MSDN subscribers whose posts are left unanswered, please check this
document: http://blogs.msdn.com/msdnts/pages/postingAlias.aspx

Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications. If you are using Outlook Express/Windows Mail, please make sure
you clear the check box "Tools/Options/Read: Get 300 headers at a time" to
see your reply promptly.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
 
Back
Top