Projiziere Recursive IEnumerable with Linq



  • Hallo

    Bekomme von einer Methode eine Collection die IEnumerbale implementiert.
    Die Objekte der Klasse haben neben ein paar properties wiederum eine Collection des selben Typs.

    class TheCollection: ICollection, IEnumerable
    {
       public virtual IEnumerator GetEnumerator();
        ...
    }
    
    public class TheObject
    {
        string Name { get; }
    
        // some more properties    
    
        TheCollection TheCollection { get; }
    }
    

    Nun würde ich gerne diese Rekursive Collection auf eine neue Rekursive Collection projizieren. Deren Objekt aber um einiges abgespeckt ist.

    Mit einer nicht rekurisven Methode würde das so aussehen.

    public class MyObject
    {
        string Name { get; }
       
         public MyObject(string name) {Name = name};
    
         MyCollection<MyObject> MyCollection { get; }
    }
    
    var coll = GetCollection();
    
    var newColl = coll.Cast<TheObject>().Select(o => new MyObject(o.Name));
     // hier fehlt jetzt noch die rekursion um die MyCollection zu füllen.
    
    


  • Wo ist der Code von MyCollection?

    Bau doch einen entsprechenden Constructor, oder eine Clone Methode, die rekursiv, einfach einen Clone des Objektes durchführt.



  • @martin-richter sagte in Projiziere Recursive IEnumerable with Linq:

    Wo ist der Code von MyCollection?

    Ups. MyCollection gibt es nicht. Hatte den Code verienfacht und hier dierekt getippt. MyCollection ist eigentlich nur Collection bzw. List.

    @martin-richter sagte in Projiziere Recursive IEnumerable with Linq:

    Bau doch einen entsprechenden Constructor, oder eine Clone Methode, die rekursiv, einfach einen Clone des Objektes durchführt.

    Ja klar das habe ich aktuell auch so. Die Frage war ob ich das irgendwie mit einem Linq ausdruck hin bekomme.



  • @booster Bitte denk mal darübr nach.

    LINQ behandelt letzten Endes einen Satz/Tabelle/Liste von Datensätzen linear.
    Rekursivität ist da gar nicht abbildbar.
    Warum willst Du zum Clonen LINQ benutzen?

    LINQ ist weder schön noch schnell. Was versprichst Du Dir davon?

    Und selbst wenn Du die rekursive Struktur in LINQ behandelst wie hier dann löst LINQ das wieder in eine flache Tabelle auf...

    LINQ und Rekursion und Clone passt in keiner Weise zusammen?

    Kommt mir vor wie jemand, der darauf besteht mit einem Uhrmacherschraubenzieher Durchbrüche in Decken vorzunehmen...



  • Hallo Martin

    @martin-richter sagte in Projiziere Recursive IEnumerable with Linq:

    LINQ ist weder schön noch schnell. Was versprichst Du Dir davon?

    😂
    Hört sich an als hätte jemand was gegen LINQ. Nun ja ich für meinen Teil finde das LINQ schön, übersichtlicher und verständlicher als irgendwelche foreach Schleifen

    Was ich mir davon versprechen:
    Der Hauptgrund ist eigentlich das lazy loading. Oder wie auch immer man es bezeichnen möchte. Dann würden die "Subs" nur erzeugt wenn man auf die Unterelemente zugreift.



  • @booster sagte in Projiziere Recursive IEnumerable with Linq:

    Der Hauptgrund ist eigentlich das lazy loading.

    Ok muss mich berichtigen. Das kann ich natürlich auch ohne Linq. Die Collection dürfte dann keine Collection sein sondern ein IEnumerable. Und dann halt statt add ein yield return.

    Finde Linq aber trotzdem schöner.

    Gut wenn es nicht geht, geht es nicht. Dann ist es halt so.