私はいくつかのリストがあります:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
リストの要素に変換を適用したい。これは2つの方法で実行できます。
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
これら2つの方法の違いは何ですか?
私はいくつかのリストがあります:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
リストの要素に変換を適用したい。これは2つの方法で実行できます。
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
これら2つの方法の違いは何ですか?
回答:
Select
はLINQ拡張メソッドであり、すべてのIEnumerable<T>
オブジェクトに対して機能しますが、ConvertAll
によってのみ実装されList<T>
ます。このConvertAll
方法は.NET 2.0以降に存在しますが、LINQは3.5で導入されました。
あなたは賛成すべきであるSelect
以上ConvertAll
、それはリストの任意の種類のために働くように、彼らは基本的に同じことを行います。
Select
とConvertAll
。前者はシーケンス内のすべてのアイテムを選択し、あなたはそれを使って何でも好きなことをすることができます。後者には明確な意図があります。このアイテムを別のアイテムに変換します。
ConvertAll
拡張機能ではなく、リストクラスのメソッドです。ToList
結果はすでにリストであるため、結果を呼び出す必要はありません。
List<int> list2 = list.ConvertAll(x => 2 * x);
そのため、違いは、ConvertAll
メソッドはリストでのみ使用でき、リストを返すことです。このSelect
メソッドは、IEnumerable<T>
インターフェースを実装する任意のコレクションで使用でき、を返しますIEnumerable<T>
。
また、処理方法が異なるため、状況に応じて長所があります。ConvertAll
この方法は、リストを実行し、一方で、一度に新たなリストを作成Select
する方法は、怠惰な実行を使用して、あなたがそれらを必要と項目だけを処理します。すべてのアイテムが必要ない場合Select
は、この方法の方が効率的です。一方、ConvertAll
リストが返されたら、元のリストを保持する必要はありません。
Select
。
最初の答えは受け入れられるべきではありません。私は以前の2007 C#Microsoft MVPです。
受け入れられた応答とConvertAll
は対照的に、Select
との組み合わせよりもはるかに効率的ですToList()
。
まず、ConvertAll
厳密に高速であり、そのために最小限のメモリを使用します。Array.ConvertAll vs SelectおよびToArrayと同じです。これは、より長い配列またはループ内の多くの呼び出しで、はるかに明白になります。
1)ConvertAll
最終リストのサイズを認識し、基本配列の再割り当てを回避します。ToList
()は、配列のサイズを何度も変更し続けます。
2)追加の呼び出しや範囲チェックを行わずに、基になる配列をループしながら、ToList
遅いインターフェイスIEnumerable<>
呼び出しを行いConvertAll
ます。
3)選択すると、追加のIEnumerable<T>
オブジェクトが作成されます。
これは少し遅れていることはわかっていますが、将来的に他のユーザーに役立つ可能性があるため、まだ追加しています。
EntityFrameworkクエリ式で使用する場合、ConvertAll()を使用することはお勧めしません。将来の使用のために式として残すのではなく、式を評価するからです。これは、最終式を評価する前に多数の呼び出しを行わなければならないため、データベースクエリの実行パフォーマンスを大幅に低下させます。
ConvertAll
はメソッドList<T>
です。あなたは、時間によって持っているリストを、あなたはすでにあなたの式を評価したしました。しかし、あなたは正しい-すべてを評価したくない場合Select
は、それが望ましい。