none
Aus der MSDN-Hotline: IEnumerable<char> in string umwandeln RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,
    heute wurde uns bei der MSDN-Entwickler-Hotline unter anderem folgende Frage gestellt:

    Wie kann ich ein IEnumerable<char> in einen string umwandeln?

    Unsere Antwort bzw. unser Lösungsvorschlag darauf war:

    Die Methode string.Join bietet sich dazu an:

    IEnumerable<char> chars = "test".Reverse();
    var str = string.Join("", chars);
    Debug.Assert(str == "tset");

    Alternativ kann der StringBuilder benutzt werden, um die Elemente der Aufzählung mit einer foreach-Schleife zu konkatenieren. Keinesfalls sollten die Strings aber direkt miteinander konkateniert werden, wie folgender Performance-Vergleich zeigt:

    class Program
    {
        static string ConcatDirect(IEnumerable<char> sequence)
        {
            string result = "";
            foreach (var str in sequence)
                result += str;
            return result;
        }
    
        static string ConcatStringJoin(IEnumerable<char> sequence)
        {
            return string.Join("", sequence.Concat(sequence));
        }
    
        static string ConcatStringBuilder(IEnumerable<char> sequence)
        {
            var sb = new StringBuilder();
            foreach (var str in sequence)
                sb.Append(str);
            return sb.ToString();
        }
    
        static void Main(string[] args)
        {
            var sequence = Enumerable.Range(0, 10000).Select(c => c.ToString()[0]);
    
            var sw = Stopwatch.StartNew();
    
            for (int i = 0; i < 1000; i++)
                ConcatDirect(sequence);
            
            Console.WriteLine(sw.Elapsed);
            sw = Stopwatch.StartNew();
    
            for (int i = 0; i < 1000; i++)
                ConcatStringJoin(sequence);
    
            Console.WriteLine(sw.Elapsed);
            sw = Stopwatch.StartNew();
    
            for (int i = 0; i < 1000; i++)
                ConcatStringBuilder(sequence);
    
            Console.WriteLine(sw.Elapsed);
            Console.ReadLine();
        }
    }

    Auf unserem Test-System wurden folgende Zeiten ausgegeben:

    00:00:11.7599980
    00:00:02.9041414
    00:00:01.1996608

    Die direkte String-Konkatenation ist im Vergleich also deutlich langsamer, die Konkatenation mithilfe des StringBuilders oder string.Join ist in etwa gleich schnell.

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Henning Dieterichs
    Entwickler-Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN-Entwickler-Hotline: http://www.msdn-online.de/Hotline
    MSDN-Entwickler-Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen , Hinweise zu Markenzeichen, Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN-Entwickler-Hotline .

    Dienstag, 16. Dezember 2014 15:37

Alle Antworten

  • Hallo,

    warum kompliziert, wenn es auch einfach (und schnell) geht:

                var sw = Stopwatch.StartNew();
                var str = new String(sequence.ToArray());
                Console.WriteLine(sw.Elapsed);
    

    Gruß Elmar

    Mittwoch, 17. Dezember 2014 08:14
    Beantworter