Ich verstehe, dass eine Liste tatsächlich Werte enthält und eine Sequenz ein Alias für ist IEnumerable<T>
. Wann sollte ich in der praktischen F # -Entwicklung eine Sequenz anstelle einer Liste verwenden?
Hier sind einige Gründe, warum ich sehen kann, wann eine Sequenz besser wäre:
- Bei der Interaktion mit anderen .NET-Sprachen oder -Bibliotheken, die dies erfordern
IEnumerable<T>
. - Müssen eine unendliche Sequenz darstellen (in der Praxis wahrscheinlich nicht wirklich nützlich).
- Benötigen Sie eine faule Bewertung.
Gibt es noch andere?
seq
diese Weise generierte jedes Mal, wenn Sie sie betrachten , unterschiedliche Zufallszahlen erzeugt . Das kann offensichtlich eine Quelle für nicht deterministische Fehler sein ...Antworten:
Ich denke, Ihre Zusammenfassung, wann Sie wählen sollen,
Seq
ist ziemlich gut. Hier sind einige zusätzliche Punkte:Seq
standardmäßig , wenn Funktionen zu schreiben, weil dann sie mit jeder .NET - Sammlung arbeitenSeq
Sie diese Option, wenn Sie erweiterte Funktionen wieSeq.windowed
oder benötigenSeq.pairwise
Ich denke, die
Seq
Standardauswahl ist die beste Option. Wann würde ich also einen anderen Typ wählen?Verwenden
List
Sie diese Option, wenn Sie eine rekursive Verarbeitung mithilfe derhead::tail
Muster benötigen(um einige Funktionen zu implementieren, die in der Standardbibliothek nicht verfügbar sind).
Verwenden
List
Sie diese Option, wenn Sie eine einfache unveränderliche Datenstruktur benötigen, die Sie Schrittfür Schritt erstellen können (z. B. wenn Sie die Liste in einem Thread verarbeiten müssen, um Statistiken anzuzeigen, und gleichzeitig die Liste in einem anderen Thread erstellen möchten, sobald Sie sie erhalten mehr Werte dh von einem Netzwerkdienst)
Verwendung
List
bei der Arbeit mit Kurzlisten - Liste ist die beste Datenstruktur, wenn der Wert häufig eine leere Liste darstellt , da er in diesem Szenario sehr effizient istVerwenden
Array
Sie diese Option, wenn Sie große Sammlungen von Werttypen benötigen(Arrays speichern Daten in einem flachen Speicherblock, sodass sie in diesem Fall speichereffizienter sind).
Verwenden
Array
Sie diese Option, wenn Sie Direktzugriff oder mehr Leistung (und Cache-Lokalität) benötigen.quelle
List
[...] , wenn Sie eine einfache brauchen unveränderliche Datenstruktur , dass Sie Schritt- für -Schritt bauen [...] und gleichzeitig weiterhin den Aufbau der Liste auf einem anderen Thread [...]“ Können Sie bitte näher auf Ihre Bedeutung hier / wie funktioniert das? Vielen Dank.x::xs
ohne vorhandene Worker zuxs
Auch bevorzugen,
seq
wenn:Sie möchten nicht alle Elemente gleichzeitig im Speicher behalten.
Leistung ist nicht wichtig.
Sie müssen vor und nach der Aufzählung etwas tun, z. B. eine Verbindung zu einer Datenbank herstellen und die Verbindung schließen.
Sie verketten nicht (wiederholt
Seq.append
wird der Überlauf gestapelt).Bevorzugen,
list
wenn:Es gibt nur wenige Elemente.
Sie werden viel voranstellen und viel enthaupten.
Weder
seq
nochlist
sind sie gut für Parallelität, aber das bedeutet nicht unbedingt, dass sie auch schlecht sind. Sie können beispielsweise entweder eine kleine Gruppe separater Arbeitselemente darstellen, die parallel ausgeführt werden sollen.quelle
Nur ein kleiner Punkt:
Seq
undArray
sind besser alsList
für Parallelität.Sie haben mehrere Möglichkeiten: PSeq aus F # PowerPack, Array.Parallel- Modul und Async.Parallel (asynchrone Berechnung). Die Liste ist aufgrund ihrer sequentiellen Natur (
head::tail
Zusammensetzung) für die parallele Ausführung schrecklich .quelle
Array
oderPSeq
viel besser sind.seq
nach besser alslist
für Parallelität?seq
sind auch für die parallele Ausführung aufgrund ihrer sequentiellen Natur schrecklich ...Liste ist funktionaler, mathematikfreundlicher. Wenn jedes Element gleich ist, sind 2 Listen gleich.
Reihenfolge ist nicht.
let list1 = [1..3] let list2 = [1..3] printfn "equal lists? %b" (list1=list2) let seq1 = seq {1..3} let seq2 = seq {1..3} printfn "equal seqs? %b" (seq1=seq2)
quelle
Sie sollten immer
Seq
in Ihren öffentlichen APIs verfügbar machen. Verwenden SieList
undArray
in Ihren internen Implementierungen.quelle
Seq
als gesehen wirdIEnumerable<T>
?seq
für die Parallelität so schlecht sind.