2011-07-18 14 views
11

Tengo un HashSet<string> que se agrega periódicamente. Lo que quiero hacer es convertir todo el HashSet en una cadena sin hacer un ciclo foreach. ¿Alguien tiene un ejemplo?C todo el contenido de HashSet <string>

+1

una sola cadena? Como en concatenar los valores? – Brian

+7

Tengo curiosidad por algo. He visto * docenas * de preguntas de SO del formulario "Quiero hacer algo que obviamente requiere un bucle, y no quiero usar un bucle". ** ¿Por qué? ** ¿De dónde este odio tiene la gente para los bucles? –

+6

Creo que la gente quiere mejorar la claridad semántica de su código. Si tuviera 'mySet.ItemsAsOneBigString()' en lugar de 'StringBuilder sb = new StringBuilder(); foreach (String s en myset) sb.append (s); return sb.ToString(); 'Sí, es pequeño, pero también lo son muchos otros" cubos "sintácticos y de azúcar marco de C#;) que hacen que el código sea más claro para leer y determinar el intento. – jasonh

Respuesta

32

Realizará un bucle sobre los contenidos, tanto si escribe explícitamente uno como si no.

Sin embargo, para hacerlo sin la escritura explícita, y si por "fundido" quiere decir "concatenar", podría escribir algo como esto

string output = string.Join("", yourSet); // .NET 4.0 
string output = string.Join("", yourSet.ToArray()); // .NET 3.5 
+8

+1, pero también vale la pena señalar que la versión de .NET 3.5 es "peor" que un bucle explícito: requiere dos pasos a través de los datos (uno para la llamada 'ToArray' y otro para la llamada' Join') y un extra asignación (la matriz generada por 'ToArray'). – LukeH

+0

Me gusta la respuesta de @ Brian, incluso le da control sobre lo que el bucle debe poner entre los valores: string.Join (",", set). ¿Habría razones de rendimiento para preferir la sintaxis 4.0 anterior? –

3

Si desea una única cadena que es una concatenación de los valores de la HashSet, esto debería funcionar ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var set = new HashSet<string>(); 
     set.Add("one"); 
     set.Add("two"); 
     set.Add("three"); 
     var count = string.Join(", ", set); 
     Console.WriteLine(count); 
     Console.ReadKey(); 
    } 
} 
2

Si quieres un único método para conseguir todos los artículos de la hashset concatenan, se puede crear un método de extensión.

[] 's

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     HashSet<string> hashset = new HashSet<string>(); 
     hashset.Add("AAA"); 
     hashset.Add("BBB"); 
     hashset.Add("CCC"); 
     Assert.AreEqual<string>("AAABBBCCC", hashset.AllToString()); 
    } 
} 

public static class HashSetExtensions 
{ 
    public static string AllToString(this HashSet<string> hashset) 
    {   
     lock (hashset) 
     { 
      StringBuilder sb = new StringBuilder(); 
      foreach (var item in hashset) 
       sb.Append(item); 
      return sb.ToString(); 
     } 
    } 
} 
1

Puede utilizar LINQ:

hashSet.Aggregate((a,b)=>a+" "+b) 

que introduce un espacio en blanco entre dos elementos de su hashset

Cuestiones relacionadas