How to reuse StringBuilder obj?
As I know if i declared a dictionary, i could call myDict.Clear() for reusing purpose.
Now if I declared a sb as a StingBuilder obj.
StringBuilder sb = new StringBuilder();
How to reuse sb? thank you.
Acturally i need print all the possible conditions开发者_Go百科 for mainDict.
one of sb expression like this(inclued in the code below)
sb.AppendFormat("{0}/{1}/{2}/{3}, {4}", pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair4.Value);
Console.WriteLine(sb.ToString());
If i declared a lot of StringBuilder objs, i still can't detect how many objs is enough for me. acturally the mainDict is very complex. The code above is a practice only. thanks.
Code updated at Jan 04.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
class test
{
private static Dictionary<string, object> mainDict = new Dictionary<string, object>();
public static void Main()
{
Dictionary<string, object> aSubDict = new Dictionary<string,object>();
Dictionary<string, object> aSub1Dict = new Dictionary<string, object>();
Dictionary<string, object> aSub2Dict = new Dictionary<string, object>();
Dictionary<string, object> aSub3Dict = new Dictionary<string, object>();
Dictionary<string, object> aSub4Dict = new Dictionary<string, object>();
mainDict.Add("ADKey", aSubDict);
mainDict.Add("ASKey", "AValue");
aSubDict.Add("BDKey", aSub1Dict);
aSubDict.Add("BSKey", "BValue");
aSub1Dict.Add("CDKey", aSub2Dict);
aSub1Dict.Add("CSKey", "CValue");
aSub2Dict.Add("DDKey",aSub3Dict);
aSub2Dict.Add("DSKey", "DValue");
aSub3Dict.Add("EDKey", aSub4Dict);
aSub3Dict.Add("ESKey", "EValue");
aSub4Dict.Add("FKey", "FValue");
StringBuilder sb;
foreach (KeyValuePair<string, object> pair1 in mainDict)
// watch out for NullReferenceException
if (!ReferenceEquals(null, mainDict[pair1.Key]) && (mainDict[pair1.Key] is string))
{
Console.WriteLine("Key = {0}, Value = {1}", pair1.Key, pair1.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}, {1}", pair1.Key, pair1.Value);
Console.WriteLine(sb.ToString());
}
// IDictionary is not the one from the Generics namespace, it is the one from the System.Collections namespace
else if (!ReferenceEquals(null, mainDict[pair1.Key]) && (mainDict[pair1.Key] is Dictionary<string, object>))
{
foreach (KeyValuePair<string, object> pair2 in (Dictionary<string, object>)pair1.Value)
if (!ReferenceEquals(null, ((Dictionary<string, object>)pair1.Value)[pair2.Key]) && (((Dictionary<string, object>)pair1.Value)[pair2.Key] is string))
{
Console.WriteLine("SubKey = {0}, Value = {1}", pair2.Key, pair2.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}/{1}, {2}", pair1.Key, pair2.Key, pair2.Value);
Console.WriteLine(sb.ToString());
}
else if (!ReferenceEquals(null, ((Dictionary<string, object>)pair1.Value)[pair2.Key]) && (((Dictionary<string, object>)pair1.Value)[pair2.Key] is Dictionary<string, object>))
{
foreach (KeyValuePair<string, object> pair3 in (Dictionary<string, object>)pair2.Value)
if (!ReferenceEquals(null, ((Dictionary<string, object>)pair2.Value)[pair3.Key]) && (((Dictionary<string, object>)pair2.Value)[pair3.Key] is string))
{
Console.WriteLine("SubKey = {0}, Value = {1}", pair3.Key, pair3.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}/{1}/{2}, {3}", pair1.Key, pair2.Key, pair3.Key, pair3.Value);
Console.WriteLine(sb.ToString());
}
else if (!ReferenceEquals(null, ((Dictionary<string, object>)pair2.Value)[pair3.Key]) && (((Dictionary<string, object>)pair2.Value)[pair3.Key] is Dictionary<string, object>))
{
foreach (KeyValuePair<string, object> pair4 in (Dictionary<string, object>)pair3.Value)
if (!ReferenceEquals(null, ((Dictionary<string, object>)pair3.Value)[pair4.Key]) && (((Dictionary<string, object>)pair3.Value)[pair4.Key] is string))
{
Console.WriteLine("SubKey = {0}, Value = {1}", pair4.Key, pair4.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}/{1}/{2}/{3}, {4}", pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair4.Value);
Console.WriteLine(sb.ToString());
}
else if (!ReferenceEquals(null, ((Dictionary<string, object>)pair3.Value)[pair4.Key]) && (((Dictionary<string, object>)pair3.Value)[pair4.Key] is Dictionary<string, object>))
{
foreach (KeyValuePair<string, object> pair5 in (Dictionary<string, object>)pair4.Value)
if (!ReferenceEquals(null, ((Dictionary<string, object>)pair4.Value)[pair5.Key]) && (((Dictionary<string, object>)pair4.Value)[pair5.Key] is string))
{
Console.WriteLine("SubKey = {0}, Value = {1}", pair5.Key, pair5.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}/{1}/{2}/{3}/{4}, {5}", pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair5.Key, pair5.Value);
Console.WriteLine(sb.ToString());
}
else if (!ReferenceEquals(null, ((Dictionary<string, object>)pair4.Value)[pair5.Key]) && (((Dictionary<string, object>)pair4.Value)[pair5.Key] is Dictionary<string, object>))
{
foreach (KeyValuePair<string, object> pair6 in (Dictionary<string, object>)pair5.Value)
if (!ReferenceEquals(null, ((Dictionary<string, object>)pair5.Value)[pair6.Key]) && (((Dictionary<string, object>)pair5.Value)[pair6.Key] is string))
{
Console.WriteLine("SubKey = {0}, Value = {1}", pair6.Key, pair6.Value);
sb = new StringBuilder();
sb.AppendFormat("{0}/{1}/{2}/{3}/{4}/{5}, {6}", pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair5.Key, pair6.Key, pair6.Value);
Console.WriteLine(sb.ToString());
}
else if (!ReferenceEquals(null, ((Dictionary<string, object>)pair5.Value)[pair6.Key]) && (((Dictionary<string, object>)pair5.Value)[pair6.Key] is Dictionary<string, object>))
{
Console.WriteLine("sub Dict Found");
}
}
}
}
}
}
}
}
Output like this
SubKey = FKey, Value = FValue
ADKey/BDKey/CDKey/DDKey/EDKey/FKey, FValue
SubKey = ESKey, Value = EValue
ADKey/BDKey/CDKey/DDKey/ESKey, EValue
SubKey = DSKey, Value = DValue
ADKey/BDKey/CDKey/DSKey, DValue
SubKey = CSKey, Value = CValue
ADKey/BDKey/CSKey, CValue
SubKey = BSKey, Value = BValue
ADKey/BSKey, BValue
Key = ASKey, Value = AValue
ASKey, AValue
You can set the Length
to 0. In .NET 4.0 there's a Clear()
method too. As the docs for Clear
state:
Clear is a convenience method that is equivalent to setting the Length property of the current instance to 0 (zero).
So it's not a big deal :)
I would personally avoid doing this unless you really need to though - I'd normally just create a new StringBuilder
. In my view that's simpler to understand - it makes it clearer that you really don't need anything from the previous object any more.
Do you have any particular reason to want to reuse the object? If it's for performance reasons, have you measured the performance and found this is a bottleneck? I suppose it could be significant if you have an instance with a very large capacity, and you want to avoid allocating it again... but that feels like a bit of an edge case to me.
(All of this applies for dictionaries as well, btw. I can't remember the last time I cleared a dictionary.)
I think rather then reusing an exting StringBuilder object, you should create a new StringBuilder object.
精彩评论