猿教程 Logo

LINQ查询延迟执行

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

延迟执行意味着表达式的求值被延迟,直到实际值需要的时候。 它通过避免不必要的执行大大提高性能。

延迟执行适用于任何内存中集合以及远程LINQ提供程序(如LINQ到SQL,LINQ到实体,LINQ到XML等)。

让我们使用以下示例来了解延迟执行:


在上面的示例中,您可以看到查询在您使用foreach循环进行迭代时实现并执行。 这称为延迟执行。 LINQ处理studentList集合,当你实际访问集合中的每个对象,并做一些与它。

要检查延迟执行是否每次都返回最新数据,请在foreach循环后再添加一个学生,并检查青少年学生列表:


如您所见,第二个foreach循环再次执行查询并返回最新数据。 延迟执行在每次执行时重新评估; 这被称为延迟评估。 这是延迟执行的主要优点之一:它总是给你最新的数据。


实现延迟执行:

您可以使用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("Accessing student {0}", std.StudentName);

            if (std.age > 12 && std.age < 20)
                yield return std;
        }
    }
}

注意,每当GetTeenAgerStudents()被调用时,我们在控制台上打印学生姓名。

您现在可以使用此扩展方法如下:

相关实例:

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 Name: {0}", teenStudent.StudentName);

运行结果:

Accessing student John 
Student Name: John 
Accessing student Steve 
Student Name: Steve 
Accessing student Bill 
Student Name: Bill 
Accessing student Ram 
Accessing student Ron

从输出中可以看到,GetTeenAgerStudents()在使用foreach循环迭代studentList时被调用。


因此,以这种方式,您可以使用yield关键字创建自定义方法,以获得延迟执行的优势。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-deferred-execution.html