当前位置: 首页 > news >正文

LINQ 要点

0-头图

上一篇


参考资料

💡 建议

  • 内容建议完整学习;
  • 内容可以根据需要学习。
  • C# 中的语言集成查询 (LINQ) | Microsoft Learn
  • LINQ 查询简介 - C# | Microsoft Learn
  • 查询表达式基础 (LINQ) - C# | Microsoft Learn

要点

  • 所有 LINQ 查询操作都由以下三个不同的操作组成:

    1. 获取数据源
    2. 创建查询
    3. 执行查询
    /*** 为方便起见,此示例将一个整数数组用作数据源;* 但其中涉及的概念同样适用于其他数据源*/// 1. 获取数据源
    int[] numbers = [ 0, 1, 2, 3, 4, 5, 6 ];// 2. 创建查询
    // numQuery 是一个 IEnumerable<int>
    var numQuery = from num in numberswhere (num % 2) == 0select num;// 3. 执行查询
    foreach (int num in numQuery)
    {Console.Write("{0,1} ", num);
    }/*** 此查询从整数数组中返回所有偶数。* 查询表达式包含三个子句:from、where 和 select。* from 子句指定数据源;* where 子句应用筛选器;* select 子句指定返回元素的类型。*/
    
  • 只有在循环访问查询变量后,才会执行查询(例如,在 foreach 语句中或对其 IEnumerator.MoveNext() 方法的直接调用)。 有关详细信息,请参阅 LINQ 查询简介。

  • 查询表达式中的变量全都是强类型,尽管在许多情况下,无需显式提供类型,因为编译器可以推断出。有关详细信息,请参阅 LINQ 查询操作中的类型关系。

  • 在编译时,查询表达式根据 C# 规范规则转换成标准查询运算符方法调用。 可使用查询语法表示的任何查询都可以使用方法语法进行表示。 不过,在大多数情况下,查询语法的可读性更高,也更为简洁。 有关详细信息,请参阅 C# 语言规范和标准查询运算符概述。

  • 查询存储在查询变量中,并用查询表达式进行初始化。你使用 C# 查询语法来编写查询。

  • 标准查询运算符按执行方式可分为两类:立即执行延迟执行。使用延迟执行的查询运算符可以进一步分为两种类别:流式处理非流式处理。具体的按照执行方式对每个标准查询运算符方法进行分类的情况请参阅 分类表

    ✡️ 重要

    此条要点建议点击所有的外部链接详细查看

  • 查询基本上是针对如何检索和组织数据的一套说明。当请求结果中的每个后续项目时,查询将延迟执行。使用 foreach 循环访问结果时,项将在受到访问时返回。若要在不执行 foreach 循环的情况下对查询求值并存储其结果,只需调用查询变量上的以下方法之一:

    • ToList
    • ToArray
    • ToDictionary
    • ToLookup
  • 在存储查询结果时,应将返回的集合对象分配给一个新变量,如下面的示例所示:

    List<int> numbers = [ 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 ];IEnumerable<int> queryFactorsOfFour = from num in numberswhere num % 4 == 0select num;// 在新变量中存储查询结果
    // 未执行 foreach 循环
    var factorsofFourList = queryFactorsOfFour.ToList();// 对新创建的列表进行读写操作,证明其持有数据
    Console.WriteLine(factorsofFourList[2]);
    factorsofFourList[2] = 0;
    Console.WriteLine(factorsofFourList[2]);
    
  • 查询表达式必须以 from 子句开头,且必须以 select 或 group 子句结尾。在第一个 from 子句与最后一个 selectgroup 子句之间,可以包含以下这些可选子句中的一个或多个:where、orderby、join、let,甚至是其他 from 子句。还可以使用 into 关键字启用 joingroup 子句的结果,作为同一查询表达式中更多查询子句的源。

    // 数据源
    int[] scores = [90, 71, 82, 93, 75, 82];// 查询表达式
    IEnumerable<int> scoreQuery = // 查询变量from score in scores // 必须以 from 子句开头where score > 80 // 筛选子句(可选的)orderby score descending // 排序子句(可选的)select score; // 必须以 select 或 group 子句结尾// 执行查询以生成结果
    foreach (var testScore in scoreQuery)
    {Console.WriteLine(testScore);
    }// 输出:93 90 82 82
    
  • 上一个示例中,scoreQuery 是一个 查询变量,有时仅被称作 查询。查询变量不存储在 foreach 循环生成中的任何实际结果数据。并且当 foreach 语句执行时,查询结果不会通过查询变量 scoreQuery 返回;而是通过迭代变量 testScore 返回。可以在第二个 foreach 循环中迭代 scoreQuery 变量。只要既没有修改它,也没有修改数据源,便会生成相同结果。

  • 查询变量可以存储采用查询语法、方法语法或是两者的组合进行表示的查询。在以下示例中,queryMajorCitiesqueryMajorCities2 都是查询变量:

    City[] cities = [new City("Tokyo", 37_833_000),new City("Delhi", 30_290_000),new City("Shanghai", 27_110_000),new City("São Paulo", 22_043_000)
    ];// 查询语法
    IEnumerable<City> queryMajorCities =from city in citieswhere city.Population > 30_000_000select city;// 执行查询以生成结果
    foreach (City city in queryMajorCities)
    {Console.WriteLine(city);
    }// 输出:
    // City { Name = Tokyo, Population = 37833000 }
    // City { Name = Delhi, Population = 30290000 }// 方法语法
    IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 30_000_000);// 执行查询以生成结果
    foreach (City city in queryMajorCities2)
    {Console.WriteLine(city);
    }// 输出:
    // City { Name = Tokyo, Population = 37833000 }
    // City { Name = Delhi, Population = 30290000 }
    
  • 另一方面,以下两个示例演示不是查询变量的变量(即使各自使用查询进行初始化)。它们不是查询变量,因为它们存储结果:

    var highestScore = (from score in scoresselect score
    ).Max();// 或者拆分表达式
    IEnumerable<int> scoreQuery = // 查询变量from score in scoresselect score;var highScore = scoreQuery.Max(); // 存储查询结果的变量
    // 如下返回同样的结果
    highScore = scores.Max();
    
    var largeCitiesList = (from country in countriesfrom city in country.Citieswhere city.Population > 10000select city
    ).ToList();// 或者拆分表达式
    IEnumerable<City> largeCitiesQuery = // 查询变量from country in countriesfrom city in country.Citieswhere city.Population > 10000select city;
    var largeCitiesList2 = largeCitiesQuery.ToList(); // 存储查询结果的变量
    

下一篇

http://www.dtcms.com/a/318492.html

相关文章:

  • 92、【OS】【Nuttx】【构建】cmake 支持构建的目标
  • SOD-YOLO:增强基于YOLO的无人机影像小目标检测
  • Product Hunt 每日热榜 | 2025-08-06
  • GoogLeNet训练
  • FastDeploy2.0:Error reading file: SafeTensorError::MetadataIncompleteBuffer
  • chdir系统调用及示例
  • 【C/C++】形参、实参相关内容整理
  • 零基础-动手学深度学习-8.7. 通过时间反向传播
  • Spring_事务
  • 国产3D大型装配设计新突破①:图纸打开设计双加速 | 中望3D 2026
  • C语言的数组与字符串练习题2
  • 如何快速翻译PPT中的文字(或简繁体转换)
  • 【51单片机2个独立按键2个独立数码管静态显示内容自定】2022-10-22
  • Perforce P4 Plan - DevOps实时规划工具
  • 指挥中心自动化的演变
  • 无人机遥控器波特率技术解析
  • 前端开发_怎么禁止用户复制内容
  • 计算机网络:如何判断B或者C类IP地址是否划分了子网
  • 设备 AI 知识库如何提升管理效率?实测分享
  • 【STM32U385RG 测评】基于VSCode的STM32开发环境搭建
  • 认识河豚毒素!剧毒神经毒素详解!
  • 向量数据库基础夯实:相关概念的详细介绍
  • 淘宝/天猫商品详情API详解(tb.item_get)
  • 一文读懂:什么是CLIP
  • 分布式存储 Ceph 的演进经验 · SOSP 2019
  • 【Web安全】csrf、ssrf和xxe的区别
  • GPT-OSS-20B vs Qwen3-14B 全面对比测试
  • 【大模型系列】gpt-oss系列模型初探
  • ACL 2025 Oral|Evaluation Agent:面向视觉生成模型的高效可提示的评估框架
  • 服务器重启后mysql5.7启动失败问题