2

作成したコレクションにIEnumerableを実装しましたが、(すべてをテストしたわけではありませんが)Seq値は正しく機能しているように見えます。コレクションの値のネイティブパフォーマンスがSeqのIEnumerableベースの関数を使用するよりも優れている場合、一部のSeq値、たとえば「last」をオーバーライドすることは可能ですか?Seqのオーバーライドに関する情報は見つかりませんでした。

4

2 に答える 2

2

いいえ-Seqモジュール内の関数をオーバーライドすることはできません。ただし、それらの一部は、入力値(seq<'T>渡すインスタンス)をチェックして、IList<'T>または'T[];のインスタンスであるかどうかを確認することにより、パフォーマンスを最適化しようとします。そうである場合、関数は最適化されたコードパスを取ります。たとえば、配列('T[])をに渡すと、配列のプロパティをSeq.length使用して長さをすばやく決定できます。.Length

モジュールの使用に固執している場合、Seq私が考えることができる唯一のパフォーマンスの最適化は、コレクションにも実装ICollection<'T>および/またはを含めることIList<'T>です。それはいくつかのケースを最適化するかもしれませんが、それはすべてのケースではありません。

于 2012-09-09T19:29:43.383 に答える
2

Seq他の回答ですでに述べたように、モジュール内の関数をオーバーライドする方法はありません。カスタムコレクションを実装する場合、最善の方法は、コアF#ライブラリで使用される標準パターンに従うことです。

  • このSeqモジュールには、最も頻繁に使用される関数と、任意のシーケンスに合理的に提供できる関数が含まれています。

  • モジュールは、特定のコレクションタイプに対してより効率的な実装を好むArrayList提供し、コレクションに固有の関数(では使用できませんSeq)を追加します(たとえば、関数List.tailArray.get)。

独自のコレクションを追加する場合の最良の方法は、次のパターンに従うことです。

  • モジュールIEnumerable<'T>の関数がご使用のタイプで機能するように実装しますSeq

  • MyCollection標準関数(少なくともユーザーにとって重要な関数)の効率的な実装を含み、コレクションに固有の機能を追加するモジュールを作成します。

于 2012-09-10T08:43:48.443 に答える