2010-01-04 19 views
5

Como sé que si declaro un diccionario, podría llamar a myDict.Clear() para fines de reutilización.Cómo reutilizar StringBuilder obj?

Ahora si declaro un sb como un obj de StingBuilder.

StringBuilder sb = new StringBuilder(); 

Cómo reutilizar sb? gracias.

Realmente necesito imprimir todas las condiciones posibles para mainDict.

uno de sb expresión como esta (inclued en el código de abajo)

sb.AppendFormat("{0}/{1}/{2}/{3}, {4}", pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair4.Value); 
Console.WriteLine(sb.ToString()); 

Si declaré una gran cantidad de objs StringBuilder, yo todavía no puede detectar cuántos objs es suficiente para mí. En realidad, el mainDict es muy complejo. El código anterior es solo una práctica. Gracias.


Código actualizada en enero 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"); 
                } 
              } 
            } 
          } 
        } 
      }   
    } 

} 

salida como esta

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 

Respuesta

17

Puede configurar el Length a 0. En .NET 4.0 hay un método Clear() también. A medida que la documentación para Clear estado:

claro es un método de conveniencia que es equivale a establecer la propiedad Length de la instancia actual a 0 (cero).

así que no es un gran problema :)

evitaría personalmente hacer esto a menos que realmente necesita sin embargo - Me normalmente solo crea una nueva StringBuilder. En mi opinión, es más fácil de entender: deja más claro que ya no necesita nada del objeto anterior.

¿Tiene algún motivo en particular para querer volver a utilizar el objeto? Si es por motivos de rendimiento, ¿ha medido el rendimiento y ha descubierto que se trata de un cuello de botella? Supongo que podría ser importante si tienes una instancia con una capacidad muy grande, y quieres evitar asignarla de nuevo ... pero eso me parece un poco difícil.

(Todo esto se aplica para los diccionarios, así, por cierto. No puedo recordar la última vez que se aclaró un diccionario.)

+0

Hola Jon, adjunté mi código de muestra. Creo que no puedo crear muchos objs nuevos de StringBuilder ... No sé el número exacto si el mainDict cambió, mi mainDict cambiará dinámicamente ... –

+0

¿Por qué crees que no puedes crear mucho? de nuevos objetos StringBuilder? No sugiero declarar más variables StringBuilder * - pero cuando quieras un nuevo StringBuilder, simplemente usa 'sb = new StringBuilder()'. Es bastante difícil de entender lo que intenta hacer tu código, me temo ... –

+0

The mainDict creado a partir de un resultado de análisis del archivo XSD, el archivo XSD mantenido por otro equipo. Necesito crear otro archivo xsd2cs.cs (string [] map y type [] map) en el momento del compilador.Es por eso que necesito imprimir todos los elementos relacionados que están separados por '/' como una cadena unida. entonces otro programa de tiempo de ejecución podría validar el XML realated basado en el archivo .cs. –

2

Creo que en vez de reutilizar un objeto StringBuilder exting, se debe crear un nuevo StringBuilder objeto.

+2

¿Alguna razón por qué? Realmente no veo ninguna ventaja en crear una nueva instancia para reutilizar la instancia existente. Depende del contexto. –

+0

@Upul, en mi caso, creo que preferiría volver a utilizar la instancia existente. ¿mejor? –

+0

@Jaco: si no quiere ninguna información del antiguo StringBuilder, ¿por qué volver a usarla? Añade complejidad lógica IMO cuando realmente solo quieres decir: "No necesito nada del anterior, dame uno nuevo". –