2011-07-18 12 views
11

Mam HashSet<string>, który jest dodawany okresowo. Chcę tylko rzucić cały HashSet na ciąg bez wykonywania pętli foreach. Czy ktoś ma przykład?C# cała zawartość HashSet <string>

+1

Pojedynczy łańcuch? Jak w konkatenacji wartości? – Brian

+7

Jestem ciekaw czegoś. Widziałem * dziesiątki * pytań SO z formularza "Chcę zrobić coś, co oczywiście wymaga pętli, a ja nie chcę używać pętli". ** Dlaczego? ** Skąd ta nienawiść ma ludzi do pętli? –

+6

Myślę, że ludzie chcą poprawić semantyczną klarowność swojego kodu. Gdybyś miał 'mySet.ItemsAsOneBigString()' zamiast 'StringBuilder sb = new StringBuilder(); foreach (String s in myset) sb.append (s); return sb.ToString(); 'Tak, jest mały, ale tak samo jest w wielu innych modułach kostek syntaktycznych i szkieletowych C#, które sprawiają, że kod jest bardziej czytelny do odczytania i określenia intencji. – jasonh

Odpowiedz

32

Zapętlisz zawartość, bez względu na to, czy piszesz jedno, czy nie.

Jednak, aby zrobić to bez wyraźnej pisemnej, a jeśli przez „cast” znaczy „łączyć”, by napisać coś takiego

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

+1, ale także warto zauważyć, że wersja .NET 3.5 jest "gorsza" niż jawna pętla: wymaga dwóch przebiegów przez dane (jedna dla wywołania "ToArray" i jedna dla połączenia "Join") i dodatkowe alokacja (tablica generowana przez 'ToArray'). – LukeH

+0

Podoba mi się odpowiedź @ Briana - daje ci nawet kontrolę nad tym, co pętla powinna umieścić między wartościami: string.Join (",", set). Czy byłyby powody, by preferować powyższą składnię 4.0? –

3

Jeśli chcesz jeden ciąg znaków, który jest połączeniem wartości w HashSet, to powinno działać ...

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

Jeśli chcesz jeden sposób, aby uzyskać wszystkie elementy na Hashset za łączone, można utworzyć metodę rozszerzenia.

[] '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

Można używać LINQ:

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

który wstawia spacje między dwoma elementami swojej HashSet