Was sind die wesentlichen Funktionen, um doppelte Elemente in einer Liste zu finden?
Übersetzt, wie kann ich die folgende Funktion vereinfachen:
%Vor%Ich bin sicher, das ist ein Duplikat. Allerdings kann ich die Frage auf dieser Website nicht finden.
AKTUALISIEREN
%Vor%Vereinfachung Ihrer Funktion :
Immer wenn Sie einen Filter gefolgt von einer Karte haben, können Sie das Paar wahrscheinlich durch ein Wählen . Der Zweck von choose besteht darin, für jeden Wert in der Liste eine Funktion auszuführen und nur die Elemente zurückzugeben, die einen Wert von Some zurückgeben (keine Werte werden entfernt, dh der Filterteil). Welchen Wert Sie auch immer hineinlegen Einige sind der Kartenausschnitt:
%Vor%Wir können einen zusätzlichen Schritt machen, indem wir die Karte entfernen. In diesem Fall ist es hilfreich, das Tupel beizubehalten, das den Schlüssel enthält, da das erste Element der Liste nicht mehr benötigt wird:
%Vor%Ist das einfacher als das Original? Vielleicht. Da Wählen zwei Zwecke kombiniert, ist es notwendigerweise komplexer als diese separaten Zwecke ( Filter und map ), und das macht es auf einen Blick schwerer zu verstehen, vielleicht den "vereinfachten" Code rückgängig zu machen. Mehr dazu später.
Zerlegung des Konzepts
Die Vereinfachung des Codes war jedoch nicht die direkte Frage. Sie haben nach Funktionen gefragt, die nützlich sind, um Duplikate zu finden. Auf hohem Niveau, wie finden Sie ein Duplikat? Es hängt von Ihrem Algorithmus und spezifischen Bedürfnissen ab:
Vielleicht müssen Sie wissen, wie oft Duplikate existieren. Ein anderer Algorithmus, der diese Anforderungen erfüllt, kann sein: "Sortiere die Gegenstände, so dass sie immer aufsteigend sind", und "markiere, ob der nächste Gegenstand der gleiche wie der aktuelle Gegenstand ist". In diesem Fall haben Sie eine List.sort gefolgt von einer List.toSeq gefolgt von Seq.windowed :
%Vor%Beachten Sie, dass dies eine Sequenz mit [5; 9; 9] und informiert Sie, dass 9 zweimal doppelt vorhanden ist.
Mein Punkt ist, dass eine vollständige Liste von Funktionen, die hilfreich bei der Suche nach Duplikaten sind, wie eine Who-is-Who-Liste der vorhandenen Sammlungsfunktionen gelesen werden kann - alles hängt davon ab, was Sie zu tun haben und Ihren spezifischen Anforderungen. Ich denke, Ihre Wahl von List.groupBy und List.choose ist wahrscheinlich so einfach wie es geht.
Vereinfachung der Wartbarkeit
Der letzte Gedanke zur Vereinfachung ist, sich daran zu erinnern, dass vereinfachender Code die Lesbarkeit Ihres Codes bis zu einem gewissen Grad verbessert . "Simplifying" über diesen Punkt hinaus werden höchstwahrscheinlich Tricks oder obskure Absichten beinhalten. Wenn ich auf ein Beispiel Code zurückblicke, den ich schon mehrere Wochen und einige Projekte geschrieben habe, wäre der kürzeste und vielleicht einfachste Code wahrscheinlich nicht so einfach zu verstehen. Daher könnte der letzte Punkt - die Vereinfachung der zukünftigen Code-Wartbarkeit - Ihr Ziel sein. Wenn dies der Fall ist, ist Ihr ursprünglicher Algorithmus so modifiziert, dass Sie nur das Tupel groupBy behalten und Kommentare hinzufügen, was die einzelnen Schritte der Pipeline bewirken:
%Vor%Die ursprünglichen Fragenkommentare zeigen bereits, dass Ihr Code für Personen unklar war, die damit nicht vertraut sind. Ist das eine Frage der Erfahrung? Bestimmt. Aber unabhängig davon, ob wir in einem Team arbeiten oder Einzelkämpfer sind, sollte die Optimierung von Code (wo möglich) für schnelles Verständnis wahrscheinlich für alle oberste Priorität sein. ( vom Sandkasten herunterklettern ... ):)
Trotzdem, viel Glück.
Sie können die letzten drei Operationen in einem List.choose
:
Hier ist eine Lösung, die nur grundlegende Funktionen und unveränderliche Datenstrukturen verwendet:
%Vor%Tags und Links f#