基本的には、メモリ内のデータを生成するので、あなたはあなたが必要とする最も広いタイプを参照しようとする必要があり、IListのを返す必要があります。たとえば、ある変数がList<...>
と宣言されている場合は、その変数に割り当てることができる値のタイプの制約を設定します。シーケンシャルアクセスだけが必要な場合がありますので、代わりにIEnumerable<...>
と宣言すれば十分でしょう。これにより、LINQ操作の結果だけでなく、変数に他の型の値を割り当てることができます。
変数がインデックスでアクセスする必要があることがわかったら、IList<...>
を実装する他の型を割り当てることができるように、それをList<...>
だけでなく、IList<...>
と再び宣言することができます。
関数の戻り値の型は、あなたによって異なります。関数が正確にList<...>
を返すことが重要と考えられる場合は、正確にList<...>
を返すように宣言します。重要なのはインデックスによる結果へのアクセスだけですが、おそらく正確にList<...>
を返すように制約する必要はない場合、戻りタイプをIList<...>
と宣言することができます(実際にはこの実装ではList<...>
のインスタンスを返します)。後でIList<...>
をサポートする別のタイプ)。また、関数の戻り値について唯一重要なことが列挙できることがわかっている場合(インデックスによるアクセスは必要ありません)、関数の戻り値の型をIEnumerable<...>
に変更して、自由度を増やす必要があります。
約AsQueriable
となっています。これもまたあなたのロジックによって異なります。遅れて評価される可能性がある場合は、不要な計算を避けるために役立つ場合や、別のクエリの一部として使用する予定の場合は、使用することをお勧めします。結果が「現実化」されなければならないと考えられる場合(つまり、現時点で計算された場合)は、List<...>
を返すほうがよいでしょう。後で計算が異なるリストになる可能性がある場合は、特に結果を具体化する必要があります。
データベースでは、短期間の中間結果にはAsQueriable
を使用しますが、より長い時間内に使用される「最終的な」結果はList
です。もちろん、マテリアライズされていないクエリをぶら下げてしまうと、データベースを実際に評価する時点でまだオープンしていないため、データベースをクローズできなくなります。