Laufzeitoptimierung: PointCollection.Concat .Net 4.5



  • Hallo Communitionen!

    PointCollection temppoints = new PointCollection(revpoints.Reverse());
    PointCollection concatpoints = new PointCollection(points.Concat(temppoints));
    

    points und revpoints sind ebenfalls vom Typ PointCollection.
    Die Reihenfolge von revpoints wird invertiert und mit points zu einer Collection zusammengeführt.

    Komischerweise funktionieren sowohl die Funktionen Reverse() und Concat( ...) nur wenn ich vorher eine tiefe Kopie erstelle. Allerdings kostet mich das 40% Laufzeit und das hätte ich gerne im Refactoring abgestellt.

    Zwei Fragen:

    1. Warum funzt ein
    points(Concat(revpoints.Reverse());
    

    nicht?
    2) Wie kann ich die Bildung einer tiefen Kopie umschiffen?

    Jemand Ideen dazu?
    Danke.

    NACHTRAG
    Erbt von Freezable.
    IsFrozen und IsFrozenInternal sind aber false.



  • Was heißt "funzt nicht"?



  • Keine Fehlermeldung,aber keine Ausführung von Concat oder Reverse.



  • Wenn du einen Funktionsaufruf hinschreibst, wird er auch ausgeführt, oder dein Compiler ist kaputt. Kannst du dich mal um eine präzise Ausdrucksweise bemühen? Was ist am Anfang in revPoints, was ist nach dem ersten Statement in tempPoints, was ist danach in concatPoints? etc.



  • ???
    System.Windows.Media.PointCollection
    IEnumerable <Point>. Reverse <Point> ()
    IEnumerable <Point>. Concat <Point>(IEnumerabe <Point> second)
    Was danach ist, ist unwichtig.
    Ergebnisse mit Breakpoint geprueft.



  • Dann geb ich mal vorerst auf. Vielleicht gibt es jemanden, der begabter darin ist, dir die relevanten Informationen aus der Nase zu ziehen. Ich wette die Antwort ist trivial, wenn erstmal klar ist, welches Problem du überhaupt hast.



  • Gut, gehe endlich aus der Leitung! 😉



  • Anmerkung: Ich kann es leider nur mit .Net 4 testen, hoffe das ändert nichts.

    Prof84 schrieb:

    1. Warum funzt ein
    points(Concat(revpoints.Reverse());
    

    nicht?

    Tut es doch ?
    Es gibt nur auch eine Enumeration zurück, du musst es wenn schon so machen:

    points = new PointCollection(points.Concat(revpoints.Reverse()));
    

    Oder alternativ:

    var enumerator = revpoints.Reverse();
    foreach(var point in enumerator)
    {
        points.Add(point);
    }
    


  • Ein ausführbares Minimalbeispiel wäre sehr hilfreich!



  • Prof84 schrieb:

    Gut, gehe endlich aus der Leitung! 😉

    Geh Du endlich aus dem Forum!



  • DarkShadow44 schrieb:

    Anmerkung: Ich kann es leider nur mit .Net 4 testen, hoffe das ändert nichts.

    Prof84 schrieb:

    1. Warum funzt ein
    points(Concat(revpoints.Reverse());
    

    nicht?

    Tut es doch ?
    Es gibt nur auch eine Enumeration zurück, du musst es wenn schon so machen:

    points = new PointCollection(points.Concat(revpoints.Reverse()));
    

    Genauso hatte ich es jetzt gelöst!
    Danke.
    Trotzdem gebe ich die Hoffnung nicht auf,
    dass ich der Zeiger weiter "verschleppen" kann.

    volkard schrieb:

    Prof84 schrieb:

    Gut, gehe endlich aus der Leitung! 😉

    Geh Du endlich aus dem Forum!

    Das würde dein Selbstbewusstsein auch nicht heben. 🙄



  • Prof84 schrieb:

    ???
    System.Windows.Media.PointCollection
    IEnumerable <Point>. Reverse <Point> ()
    IEnumerable <Point>. Concat <Point>(IEnumerabe <Point> second)
    Was danach ist, ist unwichtig.

    Natürlich ist nicht unwichtig was danach ist.
    Wenn du danach das Original modifizierst (also das Objekt das du als "this" Parameter an Concat bzw. Reverse übergeben hast), dann kann es nicht gehen.


Anmelden zum Antworten