English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
遅延実行は、実際に必要なときにまで計算を遅延させることで、不必要な実行を避け、パフォーマンスを大幅に向上させます。
遅延実行は、任何のメモリコレクションおよびリモートLINQプロバイダー(例えばLINQ)に適用されます。-to-SQL、LINQ-to-Entities、LINQ-to-XMLなど。
以下の例を使用して遅延実行を理解してみましょう:
上記の例では、foreachループを使用して迭代を行う際にクエリが実行および実行されたことがわかります。これは遅延実行と呼ばれます。実際にコレクション内の各オブジェクトにアクセスし処理を行うとき、LINQがstudentListコレクションを処理します。
遅延実行が常に最新のデータを返すか確認するには、foreachループの後に青少年Ager学生を追加し、青少年学生リストを確認してください:
ご覧の通り、2番目のforeachループで再度クエリを実行し、最新のデータを返します。遅延実行は毎回実行時に再計算される;これは惰性求値。これは遅延実行の主な利点の1つです:常に最新のデータを提供します。
c#の yield IEnumerableのカスタム拡張メソッド実装は遅延実行です。
例えば、IEnumerableにカスタム拡張メソッドGetTeenAgerStudentsを実装し、すべての青少年学生のリストを返すことができます。
public static class EnumerableExtensionMethods { public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source) { foreach (Student std in source) { Console.WriteLine("student {0}にアクセス中", std.StudentName); if (std.age > 12 && std.age < 20) yield return std; }; }; };
ご注意ください、GetTeenAgerStudents()が呼び出されたときは、常にコントロールターミナルに学生の名前を出力します。
現在、以下の拡張メソッドを使用できます:
C#:
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 13 }, new Student() { StudentID = 2, StudentName = "Steve", age = 15 }, new Student() { StudentID = 3, StudentName = "Bill", age = 18 }, new Student() { StudentID = 4, StudentName = "Ram" , age = 12 }, new Student() { StudentID = 5, StudentName = "Ron" , age = 21 }; }; var teenAgerStudents = from s in studentList.GetTeenAgerStudents() select s; foreach (Student teenStudent in teenAgerStudents) Console.WriteLine("Student 名前: {0}", teenStudent.StudentName);
student ジョンへのアクセス Student 名前: ジョン student スティーブへのアクセス Student 名前: スティーブ student ビルへのアクセス Student 名前: ビル student ラムへのアクセス student ロンへのアクセス
出力から見ると、foreach ループを使用して studentList を反復処理する場合、GetTeenAgerStudents() が呼び出されます。
そのため、この方法で、以下を使用できます。yieldキーワードを使用してカスタムメソッドを作成し、遅延実行の利点を得ます。