Andere Code-Nerds aufrufen - Alternativen zu Nested Loops?

8

Es ist nicht ungewöhnlich für mich (oder wahrscheinlich irgendjemand anderen), eine Liste von Objekten zu haben, die ich durchlaufen muss, und dann mit einer Liste von Eigenschaften zu interagieren. Ich verwende eine verschachtelte Schleife, wie folgt:

%Vor%

Ist das die Zeit und Leistung getestet für dieses Problem? Oder gibt es etwas Performanteres, Eleganteres oder einfach nur Spaß (während es natürlich immer noch lesbar und pflegbar ist)?

Der obige Code lässt mich nicht lächeln. Kann jemand bitte helfen, meiner Schleife etwas Freude zu bringen?

Danke!

Update: Ich benutze den Begriff "Nerd" im positivsten Sinne. Im Rahmen der Wikipedia-Definition heißt es: "Das bezieht sich auf eine Person, die leidenschaftlich intellektuellen Aktivitäten nachgeht". Mit "Code-Nerd" meine ich jemanden, der sich darum bemüht, sich ständig als Programmierer zu verbessern und neue, neue und elegante Arten der Programmierung zu finden, die schnell, wartbar und schön sind! Sie freuen sich, aus VB6 auszuziehen und wollen, dass kluge Leute ihren Code kritisieren und ihnen helfen, sich selbst zu schlau machen. (Anmerkung: sie mögen auch neue Wörter, die in -ify enden).

Schlussbemerkung:

Danke an Dave R., Earwicker und TheSoftwareJedi, dass sie mir den Linq-Pfad geschickt haben. Es ist genau der Code, nach dem ich gesucht habe!

    
Steve 13.12.2008, 15:50
quelle

8 Antworten

8

Sieht so aus, als ob Sie versuchen, zwei Listen kartesisch zu verbinden und eine Where-Klausel anzuwenden. Hier ist ein einfaches Beispiel, das die Linq-Syntax dafür zeigt, was ich denke, wonach Sie suchen. list1 und list2 können beliebige IEnumerable sein, Ihre where-Klausel kann detailliertere Logik enthalten, und in Ihrer SELECT-Klausel können Sie herausholen, was Sie brauchen.

%Vor%

Die Leistung ist identisch mit dem, was Sie gepostet haben - kein Wunsch, in dieser Hinsicht irre zu führen. Ich bevorzuge diese Linq-Syntax.

    
TheSoftwareJedi 13.12.2008, 17:07
quelle
8

Mit verschachtelten Schleifen ist sicherlich nichts falsch. Sie sind schnell, lesbar und gibt es schon seit der Softwareentwicklung, die ihre ersten kleinen Schritte machte.

Wenn Sie während der Iteration über eine Sammlung Aktionen ausführen möchten, stellen Sie möglicherweise fest, dass LINQ ein interessanter Weg zum Erkunden ist:

Ссылка

Sie werden sich auf spätere Versionen des Framework (ab 3.5) beschränken, aber Sie können den Ansatz der funktionalen Programmierung durchaus elegant finden. Andere Sprachfunktionen, die beim Spielen auf diesem Weg zum Tragen kommen, sind Lambdas und anonyme Methoden, die für sich genommen faszinierend sind.

Viel Glück und ich hoffe, Sie haben Spaß auf dem Weg - das ist ein großartiger Ansatz:)

    
Dave R. 13.12.2008 16:15
quelle
5
%Vor%     
Daniel Earwicker 13.12.2008 16:59
quelle
3

Wenn Sie mit jedem Objekt und jeder Eigenschaft etwas tun müssen, gibt es nicht viel zu tun. Sie könnten einige syntaktisch ansprechende Dinge tun, aber es gibt keinen Weg um die Arbeit zu erledigen.

Wenn Sie nur an einer Teilmenge der Objekte und / oder Eigenschaften arbeiten, filtern Sie sie (mit linq zu Objekten, wenn Sie .net 3.5 tun)!

Sie könnten Filter / Map / Reduce für Ihre Sets als Mittel zur Einführung einer besseren Syntax verwenden Setze Operationen.

    
Joel Meador 13.12.2008 16:04
quelle
2
%Vor%     
Amy B 15.12.2008 17:27
quelle
2

Obwohl ich die Eleganz der Linq-Lösungen mag, denke ich, dass meine Empfehlung wäre, die innere Schleife in eine Methode zu extrahieren; Ihr Code würde am Ende aussehen wie:

%Vor%

Das fühlt sich für mich haltbarer an.

    
Chris Shaffer 15.12.2008 17:39
quelle
0

In einem solchen Szenario filtern wir oft die Stücke, an denen wir interessiert sind. Ihr Block dosomethingclever () beginnt normalerweise in

%Vor%

Hier ist LINQ Ihr Freund, der Ihre Schleifen durch eine Select-Anweisung ersetzen kann. Natürlich müssen Sie die Ergebnismenge möglicherweise noch iterieren.

Tonnen von Proben hier .

    
Serge Wautier 13.12.2008 16:01
quelle
0

Ich mag Ayendes Pipes and Filters , aber es ist viel mehr Code als integrierte LINQ für einfache Schleifen (ich nehme an, das Codebeispiel in der Frage war trivial).

    
Anthony Mastrean 15.12.2008 17:35
quelle

Tags und Links