munge
munge

Reputation: 73

.net how to compare a stringbuilder to a string

In vb.net (or C#) I can't figure out how to compare a stringbuilder to a string. I have searched quite a bit and can't find the answer. I had to write my own routine. Isn't there a better way?

This doesn't work:

Dim s As String = "abc"
Dim sb As New StringBuilder("abc")
If sb.Equals(s) Then
  Console.WriteLine(sb.ToString() + " DOES equal " + s)
Else
  Console.WriteLine(sb.ToString() + " does NOT equal " + s)
End If

Results of that code is: abc does NOT equal abc

Isn't there some way of comparing a stringbuilder to a string without writing my own routine? It's probably something obvious that I'm missing since I can't find this question anywhere.

Upvotes: 2

Views: 5896

Answers (5)

vikingfabian
vikingfabian

Reputation: 541

A simple c# solution (middle road performance)

public static bool EqualStrings(StringBuilder stringBuilder, ref string text)
{
    return stringBuilder.Length == text.Length && stringBuilder.ToString() == text;
}

Upvotes: -1

munge
munge

Reputation: 73

Here's my code for the tostring() test versus my own routine:

Sub speedTest1()

Dim time As New System.Diagnostics.Stopwatch
time.Start()
Dim i As Integer
Dim sb As New StringBuilder("abc")
Dim s As String = "abc"
For i = 0 To 10000000
  equalsString(sb, s)
Next
time.Stop()
Console.WriteLine(CStr(time.ElapsedMilliseconds) + " MS for my own routine")

time.Start()
For i = 0 To 10000000
  equalsString2(sb, s)
Next
time.Stop()
Console.WriteLine(CStr(time.ElapsedMilliseconds) + " MS for tostring()")

End Sub

Function equalsString(pSB As StringBuilder, pStr As String) As Boolean

If pSB.Length <> pStr.Length Then Return False
For i As Integer = 0 To pStr.Length - 1
  If pSB(i) <> pStr(i) Then
    Return False
  End If
Next
Return True

End Function

Function equalsString2(pSb As StringBuilder, pStr As String) As Boolean

Return (pSb.ToString() = pStr)

End Function

And the result is: 527 MS for my own routine 1045 MS for tostring()

I can't get the stupid ctrl-k to work in here, but that's how I got my results

Upvotes: -2

Guffa
Guffa

Reputation: 700670

The simplest way is to get the content of the StringBuilder as a string:

If sb.ToString() = s Then ...

If you want to avoid creating that string (perhaps for memory usage concerns), I am afraid that you have to write your own routine to compare them. Basically something like:

Public Shared Function SbEquals(sb As StringBuilder, s As String) As Boolean
  If sb.Length <> s.Length Then Return False
  For i As Integer = 0 to s.Length - 1
    If sb(i) <> s(i) Return False
  Next
  Return True
End Function

Upvotes: 5

David Crowell
David Crowell

Reputation: 3813

A StringBuilder has a ToString() method.

in C#:

StringBuilder sb = new StringBuilder("test");
if (sb.ToString() == "test")
{
    // code here
}

Upvotes: 0

Habib
Habib

Reputation: 223332

Use

if sb.ToString() = s Then

Currently you are comparing StringBuilder instance to string and not their values. To get the value of StringBuilder object, you have to call ToString and then you can compare it with a string.

Upvotes: 0

Related Questions