2

私は次の事実について疑問に思っています。のすべてのデータを返すデータリポジトリがありますIEnumerable<Customer>

私のビジネスロジックでは、たとえばリストを追加するためにリストが必要になることがあります。

取得するときIEnumerable<Customer>、リストを取得するための2つのオプションがあります。

Linq拡張メソッドを使用するか、.ToList()このようにキャストします(変換ではないと思います)(List<Customer>)IEnumerable<Customer>

リストを反復に使用しないので、毎回列挙型の新しいコピーは必要ありません。この場合、私の単純なケースでは、.ToList(新しいコピーを作成する)代わりにcastメソッドを使用する必要があるというのは本当ですか?

// use simple cast?
List<Customer> customers = (List<Customers>)DataSource.GetCustomers(); 

// or if i use this i get a bit of performance loss?
List<Customer> customers = DataSource.GetCustomers().ToList(); 
4

5 に答える 5

5

ToList()メソッドがを返し、IEnumerable<Customer>内部実装を確認できないため、私はを使用します。

たぶん今はでマスクされたものをGetCustomers()返しますが、将来、内部実装が変更された場合はどうなりますか?List<>IEnumerable<>

編集 :

List<Customer>インターフェース、およびまたはのIEnumerable<Customer>ような配列を実装します。したがって、タイプのオブジェクトを受け取った場合、それがであるかどうかを確認することはできません。もちろん、キャスト先のタイプがインターフェイスの背後で同じである場合にのみキャストが機能します。そうでない場合は、例外が発生します。Customer[]LinkedList<Customer>IEnumerable<WhateverClass>List<Customer>

正しく言ったように、を使用ToList()すると、の要素を含む新しいオブジェクトを作成できますIEnumerable<>が、少なくとも、例外なくそのオブジェクトを安全に反復/変更できます。

このように特定のコレクションの実装にバインドされていないため、メソッドが返されますIEnumerable<T>。将来的には、メソッドのシグネチャを変更せずに、たとえばリストから配列などに切り替えることができます。

于 2012-07-28T12:20:11.250 に答える
2

場合によります。サイズが小さい場合は.ToList()を使用しますが、これによりリストのコピーが実行されることを理解する必要があります。

大きい場合、または頻繁に実行している場合(およびパフォーマンスが低下する場合)、. GetCustomers()から返されたオブジェクトがリストであるかどうかを確認できます。はいの場合はキャストします。そうでない場合は、.ToList()を使用してコピーを作成します。

于 2012-07-28T12:25:49.547 に答える
1

.ToList()の使用をお勧めします。パフォーマンスは低下しますが、キャストする場合は、APIの実装の詳細に関する情報を使用しており、不当な仮定を行っています。明日、誰かがIEnumerableをリストではないものに変更し、コードが例外をスローし始めます。

于 2012-07-28T12:21:09.503 に答える
1

条件を使用してキャストを実行し、将来の実装変更から保護することができます。何かのようなもの

List<Customer> customers = null;
try
{
     customers = (List<Customers>)DataSource.GetCustomers();
}
catch
{
    customers = DataSource.GetCustomers().ToList();
}

このようにして、IEnumerableがリストである限り、リストのコピーを回避できますが、何らかの理由で将来内部実装が変更された場合でも、コードは機能し続けます。

于 2012-07-28T12:30:01.380 に答える
0

IEnumerableを返すリポジトリの要点は、実際にリストであることが保証されていないということです。(現在はそうかもしれませんが、IEnumerableを使用すると、後で実装を変更できます)。

.ToList()メソッドを使用するか、リポジトリが代わりにListまたはIListを返すようにします。

于 2012-07-28T12:23:40.860 に答える