Gruselige FOR-Schleifen

Es gibt 165 Antworten in diesem Thema, welches 17.720 mal aufgerufen wurde. Der letzte Beitrag (11. Juni 2022 um 02:54) ist von oobdoo.

  • Und ein Beispiel in Javascript:

    Code
    sum = [1,2,3,4].reduce((a, b) => a + b, 0);
  • ... Mein "Job" ist, aus einer Liste alle Kombinationen von Elementen zurückzugeben, die zusammen 10 ergeben...

    Hab ich die Aufgabenstellung nicht Usergerecht beschrieben?

    Kann man daraus tatsächlich "Eine Liste, die in der Summe 10 ergibt, summieren" verstehen?

    Braucht es Beispieldaten?

  • Ja selbstverständlich ist das alles Linq. Ohne Library geht in C# gar nichts.

    Auch für List<T> musst du ja schon eine Library einbinden. Warum ist "System.Collections.Generic" ok und "System.Linq" böse?

    Nach der Logik dürftest du auch keine Listen verwenden.

    Das sind alles System-Libraries, also praktisch Teil des Sprachumfangs und keine schwindeligen Nuget-Packages.

  • ... Mein "Job" ist, aus einer Liste alle Kombinationen von Elementen zurückzugeben, die zusammen 10 ergeben...

    Hab ich die Aufgabenstellung nicht Usergerecht beschrieben?

    Kann man daraus tatsächlich "Eine Liste, die in der Summe 10 ergibt, summieren" verstehen?

    Braucht es Beispieldaten?

    Das war dein Beispiel:

    Code
    FOREACH (var item in myCol) Summe += item.Wert

    Und darauf habe ich mich bezogen.

    Aber du liest meine Postings ja auch nicht, denn ich hatte geschrieben:

    Zitat

    Wie ich schon schrieb, gibt es eine ganze Reihe von Collection-Operationen, so dass man foreach eigentlich nur noch selten braucht.

    Also kannst du jetzt natürlich genau die Beispiele bringen, die man besser mit foreach lösen kann. Also was genau willst du damit zeigen?
    In Praxis kann man aber das meiste viel eleganter mit den Collection-Operationen erledigen.

    Ich nutze die Collection-Operationen, wenn sie passen und ich nutze ForEach, wenn es besser passt. Ohne eine der beiden Lösungen grundsätzlich zu verteufeln.

    Bitte melde dich an, um diesen Link zu sehen.

    6 Mal editiert, zuletzt von detlef (7. Juni 2022 um 23:17)

  • Ich hatte Dir ursprünglich zugestimmt: Für For-Next hat man oft besseren Ersatz, und statt "Funktion(Variable)" hat man "Variable einer Klasse.Funktion()", was aufgeräumter ist:

    Wobei FOR...NEXT immer mehr durch Collection-Operationen mit Lampda-Ausdrücken ersetzt werden (zum Beispiel map in Javascript). Das klassische FOR() oder FOREACH() braucht man immer weniger. Die String-Operationen gibt es in dieser Form natürlich nicht mehr, da man mit String-Klassen arbeitet. Statt dem ganzen right, left, mid-Gedönse hat man in der Regel eine substring-Methode.

    Also von der Organisation her stimmt ich zu.

    Aber inhaltlich sind die Schleifen und Befehle ja nicht weg, sondern woanders.

    Dann hab ich noch gesagt, dass meine Denke mit "Elemente durchlaufen" und FOREACH anfängt und ich Lambda oder class.sum() hintenanstelle.

    Und dann kommst Du:

    ... Lambda ist gängige Praxis... also in modernern Softwareteams ist man ja ohne aufgeschmissen... Deine Lambda-Schreibweise ist veraltet, ich erklär Dir mal Lambda... Aber Du hältst das ja eh für Schnickschnack... Du beschränkst Dich auf einen veralteten Subset...


    Da frag ich mich ja nun natürlich:
    Ist der Detlef ein geiler Typ, der die Aufgabe mit Lambda hinbekommt und ohne die veralteten For-Schleifen auskommt?

    Die Aufgabe, für die ich Rekursion und Schleife brauche, hatte ich schon in Bitte melde dich an, um diesen Link zu sehen. genannt, und Du bist weiter Deiner Schiene gefolgt. Jetzt zeig mal.

  • Da frag ich mich ja nun natürlich:
    Ist der Detlef ein geiler Typ, der die Aufgabe mit Lambda hinbekommt und ohne die veralteten For-Schleifen auskommt?

    Die Aufgabe, für die ich Rekursion und Schleife brauche, hatte ich schon in Bitte melde dich an, um diesen Link zu sehen. genannt, und Du bist weiter Deiner Schiene gefolgt. Jetzt zeig mal.

    Über die Aufgabe habe ich tatsächlich mal nachgedacht. Ist ja eine ganz nette Übung. Ich habe meine Lösung, die ich im Kopf habe, mal mit den Lösungen auf

    Stackoverflow verglichen, wo ja diese Aufgabe "gestellt" wurde. Aber das ist alles Python-Kram, den ich überhaupt nicht verstehe. Meine Lösung wäre eine Mischung aus Foreach und der eine oder anderen Collection-Operation. Ich suche noch nach einer Lösung, um meine Permutationen ohne Rekursion hinzubekommen. Rekursionen sind sehr "teuer". Ich versuche die zu vermeiden und da wo es geht durch Iterationen zu ersetzen. Mit solchen mathematiscen Aufgaben hatte ich in den letzten Jahren wenig zu tun. Ich erstelle normalerweise eher technisch/kaufmännische Software.

    Bitte melde dich an, um diesen Link zu sehen.

    2 Mal editiert, zuletzt von detlef (8. Juni 2022 um 07:58)

  • Mit solchen mathematiscen Aufgaben hatte ich in den letzten Jahren wenig zu tun. Ich erstelle normalerweise eher technisch/kaufmännische Software.

    Wie bei mir. Ich habe jetzt 25 Jahre mit VB6.0 verbracht und das Produkt an die Anforderungen vieler Kunden angepasst. Das Standard-Zeug mit ein bisschen SQL halt, aber vor allem halt Ordnung und Überblick halten. Stressig, aber halt nix geistig Forderndes.

    Mit VB6 ist man nun aber halt altmodisch und Hinterwäldlerisch, und die Kollegen mit C#, MVS usw. machen alles schneller, besser und sicherer usw. So bin ich halt aufs Abstell-Gleis geraten, aber ich hab dabei richtig Glück gehabt. Sturmfreie Bude, keine Anpassungen an neue Kunden, kaum Support, kann C# und Experimente machen und hab dazu noch ein Hammer-Thema.

    Das war halt ein Ansatz: Erstmal die Kombinationen sammeln, dann filtern, bis eine Lösung gefunden ist. Was ja so ziemlich die Herangehensweise mit den Aggregatsfunktionen ist.

    War dann aber am Ende ein falscher Ansatz.

  • Und wer hat jetzt den Längeren? :D

    Das war nicht die Frage. :D

    Aber meiner ist universeller einsatzbar. :thumbsup:

    Die eigentliche Frage ist doch - Lambda schön und gut, aber geht auch Lambada? 8)

    - neue Spiele für den C64 -
    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.

  • Mit VB6 ist man nun aber halt altmodisch und Hinterwäldlerisch...

    Oh, wirklich? 8| Ich dachte immer das Ergebnis zählt und nicht der Weg, wie man da hin kommt.

    Meist arbeitet man ja nicht alleine für sich, sondern mit anderen. Da ist es dann schon blöd, wenn man eine Sprache benutzt, die sonst kaum noch einer verwendet.

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • Das war halt ein Ansatz: Erstmal die Kombinationen sammeln, dann filtern, bis eine Lösung gefunden ist. Was ja so ziemlich die Herangehensweise mit den Aggregatsfunktionen ist.

    War dann aber am Ende ein falscher Ansatz.

    Mein Ansatz war: Alle Permutationen der vorgegebenen Liste erstellen und dann immer von vorne testen, ob man auf die Summe 10 kommt.

    Durch die Permutationen findet man so alle Kombinationen und muss nur noch die Dupletten rausschmeissen.

    Das ist aber ein Brut-Force-Ansatz, denn man bekommt bei der vorgegeben Liste schon mehr als 5000 Permutatioen, die man abprüfen muss. Aber das war gestern Abend und halb 12. Da ist mir nichts besseres eingefallen. ;)

  • Oh, wirklich? 8| Ich dachte immer das Ergebnis zählt und nicht der Weg, wie man da hin kommt.

    Bei uns alten Hasen vielleicht. Bei der jungen Generation ist der Weg das Ziel.

    Hauptsache neue Technologien und Frameworks.

    YouTube Kanäle über Basic, den C128 und den VDC-Chip
    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.
    Commodore 8-Bit Projekte
    auf Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. zu Commodore 8-bit Hardware
    auf printables.com
  • Oh, wirklich? 8| Ich dachte immer das Ergebnis zählt und nicht der Weg, wie man da hin kommt.

    Jein...

    Einerseits: So sieht es das Management, die haben andere Prioritäten als Programmierer. Sollte man ein neues, großes Produkt noch auf VB6 machen lassen? Diese und jene Technik ist für Java und .Net einfach einzukaufen, aber für VB6 gibt es sie nicht. Sind diverse neue Techniken bekannt und eingeübt? Sprechen die Leute im Team das gleiche Fach-Chinesisch?

    Andererseits:

    Wenn alle VB6 machen ist es schön. Wenn verschiedene Sprachen benutzt werden, dann konnte man eine .dll machen. Du willst aber in .Net oder java keine Basic-dll einbinden, und umgekehrt willst Du aus VB auch kein Java- oder -Net-Unterprogramm benutzen, selbst wenn es so einfach ginge. Https in VB6, oder Unicode aus der Datenbank über ein Datacontrol auf den Schirm bringen ist nicht "einfach so" gemacht... Es gibt einiges an guten Gründen, VB6 zurückzulassen, und einiges in C# ist sehr, sehr schön, um Ordnung zu halten.

    Und wir werden ja auch älter: Kommt denn ein Nachwuchs, der 25 Jahre alten VB6-Code pflegt? Wohl kaum.

    Ich hab letztens noch C#-Code im Stil alter C-Programme oder Basic 2.0 gesehen: Unterprogramme hatten keine Rückgaben, sondern haben globale Variablen gefüllt. Das weckt ein "gewisses" Verständnis dafür, warum man "altmodisch und Hinterwäldlerisch" meiden sollte.

  • Ich hab letztens noch C#-Code im Stil alter C-Programme oder Basic 2.0 gesehen: Unterprogramme hatten keine Rückgaben, sondern haben globale Variablen gefüllt. Das weckt ein "gewisses" Verständnis dafür, warum man "altmodisch und Hinterwäldlerisch" meiden sollte.

    Aber selbst C kennt natürlich lokale Variablen.

    Aber du hast vollkommen recht. Alte Zöpfe muss man eben rechtzeit abschneiden, bevor sich niemand mehr finden, der den Kram wartet.

    Ich habe in den letzten 10 Jahren keine zwei Projekte in der gleichen Programmiersprache gemacht. Das gehört heute auch zum Berufsbild des Softwareentwicklers, dass man sich an keine Programmiersprachen mehr klammert. Wenn man sich aktuelle Stellenangebote anschaut, dann sieht man was aktuell gefordert und gesucht wird.

  • Ich hab letztens noch C#-Code im Stil alter C-Programme oder Basic 2.0 gesehen: Unterprogramme hatten keine Rückgaben, sondern haben globale Variablen gefüllt.

    Das liegt eher daran das „Option Strict On“ nicht standardmäßig in einem neuen VS Projekt eingeschaltet ist.

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • Das liegt eher daran das „Option Strict On“ nicht standardmäßig in einem neuen VS Projekt eingeschaltet ist.

    Ich weiß nicht, was bei C# die Option bedeutet. In VB.Net verhindert "Option strict on" eine automatische Typenkonvertierung zur Compilierzeit. Hat also nicht wirklich was mit globalen Variablen zu tun.

    Früher waren 64k unglaublich viel, heute reicht es nicht mal mehr für "Hello, world!".

  • Ich hab letztens noch C#-Code im Stil alter C-Programme oder Basic 2.0 gesehen: Unterprogramme hatten keine Rückgaben, sondern haben globale Variablen gefüllt.

    Das liegt eher daran das „Option Strict On“ nicht standardmäßig in einem neuen VS Projekt eingeschaltet ist.

    Nee, das kam daher, das jemand alten C-Code entdeckt oder sogar recompiliert hat und den Algorithmus in C# nutzen wollte.