C#中Linq延迟查询的例子
作者:junjie 发布时间:2022-01-15 02:43:11
标签:C#,Linq,延迟查询
提出问题
下面所给代码编译时正常,但是执行时会出错,请指出程序在执行时能够执行到编号为(1)(2)(3)的代码行中的哪一行。
using System;
using System.Collections.Generic;
using System.Linq;
namespace DeferredExecutionExp
{
class Program
{
static void Main(string[] args)
{
List<Student> studentList = new List<Student>()
{
new Student(){Id =1, Name="ZhangSan", Age=20},
new Student(){Id =2, Name=null, Age=21},
new Student(){Id =3, Name="Lisi", Age=22}
};
var queryedStudentList = studentList.Where(it => it.Name.Trim() != "ZhangSan");//(1)
if (queryedStudentList.Count() > 0)//(2)
{
foreach (var student in queryedStudentList)//(3)
{
Console.WriteLine(student.Name);
}
}
}
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
问题分析
其实,发现问题并不难,很显然在执行代码“it => it.Name.Trim()”时会出错,因为集合studentList中第二个学生的Name属性为null,当遍历到该学生时,对其Name属性执行Trim操作,不出错才怪呢。既然在这里会出错,那么程序肯定是执行到该行就GameOver了呀。但是实际情况又会是这样吗?
动手验证
单步调试程序,发现:执行到代码行(1)时,程序并没有出错,而是在执行代码行(2)时,程序才出现了异常,查看异常信息,却提示的是在执行代码行(1)时有问题,为什么会这样呢?为什么执行到代码行(2)时还会去执行代码行(1)呢?这全都是因为Linq的延迟查询导致的。
延迟查询
延迟查询的意思是说:在运行期间定义查询表达式时,查询不会执行,只有到迭代数据项时查询才会被执行。本例中的代码行(1)只是定义了查询,而代码行(2)中当调用Count方法时便会遍历数据项,这时便会执行查询,也就是说会去执行代码行(1)定义的查询,最终导致了本例中这种现象的出现。
所以,本例中的代码最终能够执行到的代码行是(2)。
0
投稿
猜你喜欢
- 一、前言ConcurrentHashMap的源码采用了一种比较独特的方式对map中的元素数量进行统计,自然是要好好研究一下其原理思想,同时也
- 什么是Kotlin?Kotlin是一种可以在 Java 虚拟机 (JVM) 上运行的开源编程语言。该语言可以在许多平台上运行。它是一种将面向
- 问题现象今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析数据格式:"[1677660600000, 167766
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 num
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下1.RandomAccessFileRandomAcce
- 大家好,在这篇文章中,我们将学习如何添加动画,同时从一个页面到其他在 Flutter。我们将覆盖不同类型的动画和实现基本动画 Flutter
- 本文实例为大家分享了Java实现五子棋的具体代码,供大家参考,具体内容如下任务概述:五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策
- 本文研究的主要是优化MyBatis配置文件中的配置的相关内容,具体介绍如下。一、连接数据库的配置单独放在一个properties文件中之前,
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象、封装、继承和多态。而本文介绍的接口和抽象类就是面向对象编程中“抽象”
- 一、背景当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢
- 概述透视表是依据已有数据源来创建的交互式表格,我们可在excel中创建透视表,也可编辑已有透视表。所需工具:Free Spire.XLS f
- 本文实例为大家分享了java微信公众号支付示例代码,供大家参考,具体内容如下开始之前,先准备好:appid、商家号、商户密匙。工具类:MD5
- 在项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。常用的方法有Object.to
- 01-前言:什么是循环依赖?首先,我们先明确下依赖的定义。 如果一个 Bean bar 的属性,引用了容器中的另外一个 Bean foo,那
- 在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据
- 本文主要是用到java中的swing技术,以及JMFjar中的API,为大家分享了java音乐播放器的具体实现代码,供大家参考,具体内容如下
- 概述:Flutter中常用的滑动布局 ScrollView 有 SingleChildScrollView、NestedScrollView
- 在mybatis中sql是写在xml映射文件中的,如果sql中有一些特殊字符的话,在解析xml文件的时候就会被转义,如若不希望被转义,那该怎
- 简介optional类是java8中引入的针对NPE问题的一种优美处理方式,源码作者也希望以此替代null。历史1965年,英国一位名为To