C#中Linq延遲查詢的例子
提出問題
下面所給代碼編譯時(shí)正常,但是執(zhí)行時(shí)會(huì)出錯(cuò),請(qǐng)指出程序在執(zhí)行時(shí)能夠執(zhí)行到編號(hào)為(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; }
}
}
問題分析
其實(shí),發(fā)現(xiàn)問題并不難,很顯然在執(zhí)行代碼“it => it.Name.Trim()”時(shí)會(huì)出錯(cuò),因?yàn)榧蟬tudentList中第二個(gè)學(xué)生的Name屬性為null,當(dāng)遍歷到該學(xué)生時(shí),對(duì)其Name屬性執(zhí)行Trim操作,不出錯(cuò)才怪呢。既然在這里會(huì)出錯(cuò),那么程序肯定是執(zhí)行到該行就GameOver了呀。但是實(shí)際情況又會(huì)是這樣嗎?
動(dòng)手驗(yàn)證
單步調(diào)試程序,發(fā)現(xiàn):執(zhí)行到代碼行(1)時(shí),程序并沒有出錯(cuò),而是在執(zhí)行代碼行(2)時(shí),程序才出現(xiàn)了異常,查看異常信息,卻提示的是在執(zhí)行代碼行(1)時(shí)有問題,為什么會(huì)這樣呢?為什么執(zhí)行到代碼行(2)時(shí)還會(huì)去執(zhí)行代碼行(1)呢?這全都是因?yàn)長(zhǎng)inq的延遲查詢導(dǎo)致的。
延遲查詢
延遲查詢的意思是說:在運(yùn)行期間定義查詢表達(dá)式時(shí),查詢不會(huì)執(zhí)行,只有到迭代數(shù)據(jù)項(xiàng)時(shí)查詢才會(huì)被執(zhí)行。本例中的代碼行(1)只是定義了查詢,而代碼行(2)中當(dāng)調(diào)用Count方法時(shí)便會(huì)遍歷數(shù)據(jù)項(xiàng),這時(shí)便會(huì)執(zhí)行查詢,也就是說會(huì)去執(zhí)行代碼行(1)定義的查詢,最終導(dǎo)致了本例中這種現(xiàn)象的出現(xiàn)。
所以,本例中的代碼最終能夠執(zhí)行到的代碼行是(2)。
- C#集合查詢Linq在項(xiàng)目中使用詳解
- C# Linq延遲查詢的執(zhí)行實(shí)例代碼
- c# Linq查詢?cè)斀?/a>
- c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
- C#使用LINQ查詢表達(dá)式的基本子句總結(jié)
- C# linq查詢之動(dòng)態(tài)OrderBy用法實(shí)例
- C#使用linq語句查詢數(shù)組中以特定字符開頭元素的方法
- C#使用linq查詢大數(shù)據(jù)集的方法
- C#中Linq查詢基本操作使用實(shí)例
- C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法
- C#使用LINQ查詢操作符實(shí)例代碼(一)
相關(guān)文章
C#實(shí)現(xiàn)程序開機(jī)啟動(dòng)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)程序開機(jī)啟動(dòng)的方法,涉及C#針對(duì)應(yīng)用程序及注冊(cè)表的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
提高C# StringBuilder操作性能優(yōu)化的方法
本篇文章主要介紹使用C# StringBuilder 的項(xiàng)目實(shí)踐,用于減少內(nèi)存分配,提高字符串操作的性能。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
C#難點(diǎn)逐個(gè)擊破(7):checked與unchecked
checked 關(guān)鍵字用于對(duì)整型算術(shù)運(yùn)算和轉(zhuǎn)換顯式啟用溢出檢查。2010-02-02
C# DataGridView綁定數(shù)據(jù)源的方法
這篇文章主要為大家詳細(xì)介紹了C# DataGridView綁定數(shù)據(jù)源的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
支持多類型數(shù)據(jù)庫(kù)的c#數(shù)據(jù)庫(kù)模型示例
本文為大家提供一個(gè)c#數(shù)據(jù)庫(kù)訪問模型,支持多類型數(shù)據(jù)庫(kù),簡(jiǎn)單抽取數(shù)據(jù)庫(kù)訪問函數(shù),大家參考使用吧2014-01-01

