C#8.0本质论第十六章--使用查询表达式的LINQ

2023-12-05

C#8.0本质论第十六章–使用查询表达式的LINQ

像SQL这样的专业查询语言虽然容易阅读和理解,但又缺乏C#语言的完整功能。这正是C#语言设计者在C#3.0中添加 查询表达式 语法的原因。

本章大部分都类似于SQL,一般不会使用到,在用到的时候再去书里查吧。

16.1查询表达式概述

开发者经常对集合进行赛选来删除不想要的项,以及对集合进行投射将其中的项变成其它形式。

        IEnumerable<string> selection =
            from word in CSharp.Keywords
            where !word.Contains('*')
            select word;
16.1.1投射
        IEnumerable<string> fileNames = Directory.GetFiles(
            rootDirectory, searchPattern);
 
        IEnumerable<FileInfo> fileInfos =
            from fileName in fileNames
            select new FileInfo(fileName);
16.1.2筛选
        IEnumerable<FileInfo> files =
            from fileName in Directory.EnumerateFiles(
                rootDirectory, searchPattern)
            where File.GetLastWriteTime(fileName) <
                DateTime.Now.AddMonths(-1)
            select new FileInfo(fileName);
16.1.3查询
        IEnumerable<string> fileNames =
            from fileName in Directory.EnumerateFiles(
                rootDirectory, searchPattern)
            orderby (new FileInfo(fileName)).Length descending,
                fileName
            select fileName;
16.1.4let子句
        IEnumerable<FileInfo> files =
            from fileName in Directory.EnumerateFiles(
                rootDirectory, searchPattern)
            orderby new FileInfo(fileName).Length, fileName
            select new FileInfo(fileName);
16.1.5分组
    private static void GroupKeywords1()
    {
        IEnumerable<IGrouping<bool, string>> selection =
            from word in CSharp.Keywords
            group word by word.Contains('*');
 
        foreach(IGrouping<bool, string> wordGroup
            in selection)
        {
            Console.WriteLine(Environment.NewLine + "{0}:",
                wordGroup.Key ?
                    "Contextual Keywords" : "Keywords");
            foreach(string keyword in wordGroup)
            {
                Console.Write(" " +
                    (wordGroup.Key ?
                        keyword.Replace("*", null) : keyword));
            }
        }
    }
16.1.6使用into实现查询延续
    private static void GroupKeywords1()
    {
        IEnumerable<IGrouping<bool, string>> keywordGroups =
            from word in CSharp.Keywords
            group word by word.Contains('*');
 
        IEnumerable<(bool IsContextualKeyword, 
            IGrouping<bool, string> Items)> selection =
            from groups in keywordGroups
            select
            (
                IsContextualKeyword: groups.Key,
                Items: groups
            );
 
        foreach (
            (bool isContextualKeyword, IGrouping<bool, string> items)
                in selection)
        {
 
            Console.WriteLine(Environment.NewLine + "{0}:",
                isContextualKeyword ?
                    "Contextual Keywords" : "Keywords");
            foreach (string keyword in items)
            {
                Console.Write(" " + keyword.Replace("*", null));
            }
        }
    }
16.1.7用多个from子句"平整"序列的序列
var selection =
    from word in CSharp.Keywords
    from character in word
    select character;

var numbers = new[] { 1, 2, 3 };
IEnumerable<(string Word, int Number)> product =
     from word in CSharp.Keywords
     from number in numbers
     select (word, number);

16.2查询表达式只是方法调用

令人惊讶的是,在C#3.0中引入查询表达式并未对CLR或者CIL进行任何改动。相反,编译器只是将查询表达式转换成一系列方法调用。

private static void ShowContextualKeywords1()
{
    IEnumerable<string> selection =
        from word in CSharp.Keywords
        where !word.Contains('*')
        select word;
    // ...
}

编译之后,会转换成一个由System.Linq.Enumerable提供的IEnumerable扩展方法调用。

private static void ShowContextualKeywords2()
{
    IEnumerable<string> selection =
        CSharp.Keywords.Where(word => !word.Contains('*'));
    // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#8.0本质论第十六章--使用查询表达式的LINQ 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即

随机推荐

  • C++单例模式

    pragma once namespace utility 需要拼接一下命名空间 utility define SINGLETON x friend class utility Singleton
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • 编程分为哪几种

    前言 编程是一项广泛的技能 涉及到许多不同的编程语言和编程领域 以下是编程的一些常见类型 应用程序开发 开发桌面应用程序 移动应用程序 网络应用程序 游戏等等 例如 Java C C Python Swift Objective C Kot
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • 使用python streamlit库快速创建一个购物网站

    streamlit Streamlit 是一个基于 Python 的 Web 应用程序框架 致力于以更高效 更灵活的方式可视化数据 并分析结果 Streamlit是一个开源库 可以帮助数据科学家和学者在短时间内开发机器学习 ML 可视化仪表
  • 强化学习在机器人导航中的路径规划策略分析

    机器人导航是指机器人在未知环境中自主移动的过程 路径规划是机器人导航中的一个重要问题 其目的是找到一条最优路径 使机器人能够快速 安全地到达目的地 传统的路径规划方法往往基于启发式算法 如A 算法 Dijkstra算法等 这些方法在一定程度
  • InterLM代码解析

    interLM的Transformer架构 重要模块的实现解析 Decoder架构 class InternLMDecoderLayer nn Module def init self config InternLMXComposerCon
  • 服务器托管与服务器租用的详细比较

    在当今数字化时代 服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式 它们都提供了一种将服务器放置在专业机房中的解决方案 但在具体实施和使用过程中存在一些差异 下面将详细比较这两种方式的优势和劣势 1 服务器托管 服务器托管是指用
  • 详解Spring中的Profile

    详解Spring中的Profile 一 前言 二 Spring中的Profile 是什么 三 配置Spring profile 3 1 例子需要的Maven依赖 3 2 例子代码 四 激活Profile的其他几种方式 一 前言 由于在项目中
  • 赚了!用Python兼职,月赚49K!

    大家好 先说个冷知识 现在业界对Python技术服务的需求量正在暴涨 当下早已供不应求 且有愈演愈烈的趋势 极不平衡的供需关系 使Python兼职的价格变得极高 几乎所有的Python圈内人 都在利用Python写代码接私活赚钱 近期Pyt
  • 【uniapp】小程序中input输入框的placeholder-class不生效解决办法

    问题描述 uniapp微信小程序 使用input组件时 想要改变提示词 placeholder 的样式 但是使用 placeholder class 改变不了 如下
  • 光环云与亚马逊云科技成功举办“合作伙伴成长峰会:赋能与共赢”活动

    光环云作为由光环新网和西云数据所提供的亚马逊云科技中国区域推广计划的授权增值推广商 致力于帮助中国企业更加方便 高效 安全地享受亚马逊云科技云服务 加速数字化转型 2023年11月29日 光环云携手亚马逊云科技和商礼科技成功举办 合作伙伴成
  • Linux 编译安装colmap

    COLMAP可以作为独立的app 通过命令行或者图形交互界面使用 也可以作为一个库被包含到其他源代码中 这里记录一下编译安装colmap的过程 首先需要安装好CUDA CUDA具体安装过程这里就不赘述了 在GitHub上下载源代码 我这里就
  • VIM使用快捷键快速移动到某个位置

    光标移动到行首 行首没有空格 光标移动到行首 行首有空格 数字0 光标移动到行尾 移动到指定行 7G 数字加一个大G 光标移动到文件开始 gg 两个小g 光标移动到文件末尾 G 一个大G 窗口向上滚动一行 Ctrl e scroll up
  • mapbox实现点选要素

    成果图 核心代码 核心逻辑就是指定一个唯一的高亮要素对象 全图监听点击事件 通过queryRenderedFeatures鼠标点拿到要素的id 然后将要素的状态改为选中 这样选中的要素的样式就会改为我们设置好的选中的样式 记住这个高亮对象
  • Gazebo 中为地面和车轮添加摩擦属性

    Gazebo 中为地面和车轮添加摩擦属性 Link friction properties not applied from URDF to Gazebo SDFormat Specification Adding friction to
  • 无尘车间等级划分标准

    在制造业 医药行业 食品行业等领域中 无尘车间是一个非常重要的组成部分 无尘车间能够提供清洁 高度控制的环境 有利于产品质量的提高和生产过程的优化 SICOLAB喜格 将详细介绍无尘车间的等级划分标准 包括其定义 方法和重要性 一 无尘车间
  • Matlab中文注释在Linux中乱码解决

    Linux for Matlab中文注释乱码 Linux for Matlab中文注释乱码 亲测有效 中文注释乱码的原因是windows下的m文件采用的是gbk编码 只要将所有的m文件转成 utf8文件 显示就正常了 查看支持的语言 enc
  • Linux系列-1 Linux启动流程——init与systemd进程

    背景 最近对所有项目完成了一个切换 服务管理方式由 init gt systemd 对相关知识进行总结一下 1 启动流程 服务器的整体启动流程如下图所示 POST 计算机通电后进行POST Power On Self Test 加电自检 检
  • C#8.0本质论第十六章--使用查询表达式的LINQ

    C 8 0本质论第十六章 使用查询表达式的LINQ 像SQL这样的专业查询语言虽然容易阅读和理解 但又缺乏C 语言的完整功能 这正是C 语言设计者在C 3 0中添加 查询表达式 语法的原因 本章大部分都类似于SQL 一般不会使用到 在用到的