list には実際に値が含まれており、 sequence はIEnumerable<T>
のエイリアスであることを理解しています。実際のF#開発では、リストではなくシーケンスをいつ使用する必要がありますか?
シーケンスの方が良い場合がある理由は次のとおりです。
IEnumerable<T>
を必要とする他の.NET言語またはライブラリとやり取りする場合。他にありますか?
Seq
をいつ選択するかについての要約はかなり良いと思います。追加のポイントは次のとおりです。
Seq
を使用します。これは、.NETコレクションで機能するためです。Seq.windowed
やSeq.pairwise
などの高度な機能が必要な場合は、Seq
を使用してくださいデフォルトでSeq
を選択するのが最良の選択だと思います。そのため、いつ別のタイプを選択するのですか?
head::tail
パターンを使用して再帰的な処理が必要な場合は、List
を使用します
(標準ライブラリでは利用できない機能を実装するため)
段階的に構築できる単純な不変のデータ構造が必要な場合は、List
を使用します
(たとえば、ある統計を表示するために、あるスレッドでリストを処理する必要があり、同時にネットワークサービスからより多くの値を受信するときに別のスレッドでリストの構築を継続する必要がある場合)
短いリストで作業する場合はList
を使用してください。値が空のリストを表すことが多い場合は、listが最適なデータ構造です。このシナリオでは非常に効率的です。
値型の大きなコレクションが必要な場合は、Array
を使用します
(配列はデータをフラットメモリブロックに格納するため、この場合はメモリ効率が向上します)
ランダムアクセスまたはより多くのパフォーマンス(およびキャッシュの局所性)が必要な場合は、Array
を使用します
また、次の場合はseq
を優先します。
すべての要素を同時にメモリに保持する必要はありません。
パフォーマンスは重要ではありません。
列挙の前後に何かをする必要があります。データベースに接続し、接続を閉じます。
連結していません(繰り返しSeq.append
はスタックオーバーフローします)。
次の場合にlist
を優先します。
いくつかの要素があります。
あなたは多くを前につけて首を切るでしょう。
seq
もlist
も並列処理には適していませんが、必ずしもそれらが悪いことを意味するわけではありません。たとえば、どちらかを使用して、並行して行われる別個の作業項目の小さな束を表すことができます。
小さな点が1つだけあります:Seq
とArray
は、並列処理に関してList
よりも優れています。
いくつかのオプションがあります: PSeq F#PowerPackから、 Array.Parallel モジュールおよび Async.Parallel (非同期計算)。リストはその逐次的な性質(head::tail
構成)。
公開APIでは常にSeq
を公開する必要があります。内部実装でList
およびArray
を使用します。