私はいくつかのリストがあります:
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は、それが望ましい。