2011-02-25 7 views
9

Tengo un objeto StringBuilder existente, el código le agrega algunos valores y un delimitador. Ahora quiero modificar el código para agregar la lógica de que, antes de agregar el texto, quiero verificar si realmente existe en la variable del generador de cadenas o no. Si no, solo añada lo contrario ignore. ¿Cual es la mejor manera de hacerlo? ¿Debo cambiar el objeto por el tipo de cadena? Necesita un mejor enfoque que no obstaculice un rendimiento.En C#, la mejor manera de comprobar si stringbuilder contiene una subcadena

public static string BuildUniqueIDList(context RequestContext) 
{ 
    string rtnvalue = string.Empty; 
    try 
    { 
     StringBuilder strUIDList = new StringBuilder(100); 
     for (int iCntr = 0; iCntr < RequestContext.accounts.Length; iCntr++) 
     { 
      if (iCntr > 0) 
      { 
       strUIDList.Append(","); 
      } 
      //need to do somthing like strUIDList.Contains(RequestContext.accounts[iCntr].uniqueid) then continue other wise append 
      strUIDList.Append(RequestContext.accounts[iCntr].uniqueid); 
     } 
     rtnvalue = strUIDList.ToString(); 
    } 
    catch (Exception e) 
    { 
     throw; 
    } 
    return rtnvalue; 
} 

No estoy seguro de si es conveniente tener algo así como será eficiente: if (!. StrUIDList.ToString() contiene (RequestContext.accounts [iCntr] .uniqueid.ToString()))

Respuesta

8

Personalmente me gustaría utilizar:

return string.Join(",", RequestContext.accounts 
             .Select(x => x.uniqueid) 
             .Distinct()); 

No hay necesidad de bucle de forma explícita, utilice manualmente un StringBuilder etc ... apenas expresar todo declarativa :)

(Usted Tendría que llamar al ToArray() al final si no está utilizando .NET 4, lo que obviamente reduciría la eficiencia un poco ... pero dudo que se convierta en un cuello de botella para su aplicación.)

EDIT: Okay , para una solución no LINQ ... si el tamaño es razonablemente pequeña que acababa de para:

// First create a list of unique elements 
List<string> ids = new List<string>(); 
foreach (var account in RequestContext.accounts) 
{ 
    string id = account.uniqueid; 
    if (ids.Contains(id)) 
    { 
     ids.Add(id); 
    } 
} 

// Then convert it into a string. 
// You could use string.Join(",", ids.ToArray()) here instead. 
StringBuilder builder = new StringBuilder(); 
foreach (string id in ids) 
{ 
    builder.Append(id); 
    builder.Append(","); 
} 
if (builder.Length > 0) 
{ 
    builder.Length--; // Chop off the trailing comma 
} 
return builder.ToString(); 

Si usted podría tener un gran colección de cadenas, se puede utilizar como un Dictionary<string, string> tipo de falso HashSet<string>.

+0

Malo, debería haberlo mencionado, ¿puedo hacer esto sin LINQ? En .net 2.0? –

+0

@ user465876: Puedes, pero personalmente me gustaría tener LINKBridge en su lugar ... LINQ es * tan * útil, vale la pena conseguir el backport. –

+0

Jon, gracias por la propina. Pronto nos moveremos a 3.5 y luego definitivamente usaré LINQ al máximo. Pero por el momento, tengo que apegarme a la solución que no sea LINQ :(Si no te importa, puedes decirme cómo hacer esto en 2.0 sin LINQ/LINQBridge. –

Cuestiones relacionadas