C# LINQ 详细用法以及概念

LINQ(Language Integrated Query)是C#和.NET框架中的一个强大功能,它允许开发者使用查询语法来访问和操作数据集合。LINQ提供了一种一致且直观的方式来处理不同类型的数据源,如集合、XML文档、数据库等。本文将详细讲解LINQ的各种属性和方法,以及如何在实际应用中使用它们。

1. LINQ 简介

LINQ 提供了一种声明性的语法,类似于SQL,可以对任何实现了 IEnumerable<T>IQueryable<T> 接口的数据源进行查询。它有以下几个主要的部分:

  • LINQ to Objects:对内存中的对象进行查询。
  • LINQ to XML:对XML数据进行查询。
  • LINQ to SQL:对SQL数据库进行查询。
  • LINQ to Entities:对Entity Framework数据模型进行查询。

2. 基本语法

2.1 查询表达式

查询表达式类似于SQL语法,主要由fromwhereselect等子句组成。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };

// 定义查询表达式
var result = from n in numbers
             where n % 2 == 0
             select n;

// 执行查询
foreach (var n in result)
{
    Console.WriteLine(n);
}

2.2 方法语法

LINQ也可以使用方法调用链来表达查询,这种语法通常与Lambda表达式一起使用。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };

// 定义查询
var result = numbers.Where(n => n % 2 == 0).Select(n => n);

// 执行查询
foreach (var n in result)
{
    Console.WriteLine(n);
}

3. 常用方法

3.1 Where

Where 方法用于筛选数据集合中的元素。它接受一个返回布尔值的Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var n in evenNumbers)
{
    Console.WriteLine(n); // 输出 2 和 4
}

3.2 Select

Select 方法用于将数据集合中的每个元素投射为新的形式。它接受一个Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n);

foreach (var n in squaredNumbers)
{
    Console.WriteLine(n); // 输出 1, 4, 9, 16, 25
}

3.3 OrderBy 和 OrderByDescending

OrderByOrderByDescending 方法用于对数据集合进行排序。它们接受一个用于排序的键选择器Lambda表达式。例如:

string[] names = { "Charlie", "Bob", "Alice" };
var sortedNames = names.OrderBy(name => name);

foreach (var name in sortedNames)
{
    Console.WriteLine(name); // 输出 Alice, Bob, Charlie
}

var sortedNamesDesc = names.OrderByDescending(name => name);

foreach (var name in sortedNamesDesc)
{
    Console.WriteLine(name); // 输出 Charlie, Bob, Alice
}

3.4 GroupBy

GroupBy 方法用于将数据集合中的元素分组。它接受一个分组键选择器Lambda表达式。例如:

string[] words = { "apple", "banana", "apricot", "blueberry", "cherry" };
var groupedWords = words.GroupBy(word => word[0]);

foreach (var group in groupedWords)
{
    Console.WriteLine($"Key: {group.Key}");
    foreach (var word in group)
    {
        Console.WriteLine(word);
    }
}

3.5 Join

Join 方法用于连接两个数据集合。它接受四个参数:外部集合、内部集合、外键选择器、内键选择器和结果选择器。例如:

var students = new[]
{
    new { StudentId = 1, Name = "Alice" },
    new { StudentId = 2, Name = "Bob" }
};

var scores = new[]
{
    new { StudentId = 1, Score = 90 },
    new { StudentId = 2, Score = 85 }
};

var studentScores = students.Join(
    scores,
    student => student.StudentId,
    score => score.StudentId,
    (student, score) => new { student.Name, score.Score }
);

foreach (var studentScore in studentScores)
{
    Console.WriteLine($"{studentScore.Name}: {studentScore.Score}");
}

4. 高级用法

4.1 集合运算符

LINQ 提供了一些集合运算符,如 UnionIntersectExcept,用于对集合进行并集、交集和差集操作。例如:

int[] set1 = { 1, 2, 3 };
int[] set2 = { 3, 4, 5 };

var union = set1.Union(set2); // { 1, 2, 3, 4, 5 }
var intersect = set1.Intersect(set2); // { 3 }
var except = set1.Except(set2); // { 1, 2 }

foreach (var n in union) { Console.WriteLine(n); }
foreach (var n in intersect) { Console.WriteLine(n); }
foreach (var n in except) { Console.WriteLine(n); }

4.2 聚合函数

LINQ 提供了一些聚合函数,如 CountSumAverageMinMax,用于对集合进行聚合计算。例如:

int[] numbers = { 1, 2, 3, 4, 5 };

int count = numbers.Count(); // 5
int sum = numbers.Sum(); // 15
double average = numbers.Average(); // 3
int min = numbers.Min(); // 1
int max = numbers.Max(); // 5

Console.WriteLine($"Count: {count}, Sum: {sum}, Average: {average}, Min: {min}, Max: {max}");

4.3 转换运算符

LINQ 提供了一些转换运算符,如 ToListToArrayToDictionary,用于将查询结果转换为其他集合类型。例如:

int[] numbers = { 1, 2, 3, 4, 5 };

List<int> numberList = numbers.ToList();
int[] numberArray = numbers.ToArray();
Dictionary<int, int> numberDictionary = numbers.ToDictionary(n => n, n => n * n);

foreach (var n in numberList) { Console.WriteLine(n); }
foreach (var n in numberArray) { Console.WriteLine(n); }
foreach (var kvp in numberDictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); }

5. 实际应用中的例子

5.1 处理数据库

LINQ to SQL 或 LINQ to Entities(EF)可以用于查询数据库。例如,使用 Entity Framework:

using (var context = new SchoolContext())
{
    var students = context.Students.Where(s => s.Age > 18).ToList();

    foreach (var student in students)
    {
        Console.WriteLine($"{student.Name}, {student.Age}");
    }
}

5.2 处理XML

LINQ to XML 可以用于查询和操作XML文档。例如:

XDocument doc = XDocument.Load("books.xml");

var books = from book in doc.Descendants("book")
            where (int)book.Element("price") > 30
            select new
            {
                Title = (string)book.Element("title"),
                Price = (int)book.Element("price")
            };

foreach (var book in books)
{
    Console.WriteLine($"{book.Title}, {book.Price}");
}

LINQ 在 C# 中非常强大且灵活的功能,它提供了多种操作数据集合的方式,让我们的代码更加简洁和可读。本文记录一下这些常用到的,以后可以来翻一翻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/780974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLC【搭建服务端】

PLC搭建服务端 文章目录 PLC搭建服务端前言一、搭建PLC服务器二、打开ModSean32获取数据总结 前言 使用博图V16编写PLC搭建服务器&#xff0c;使用 ModSean32 读取其中数据 一、搭建PLC服务器 打开博图V16点击项目进行新建&#xff0c;编辑好项目名称、及项目路径&#xff0c…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP&#xff0c;输入函数以及左右端点&#xff0c;绘制出函数图像。 编写回调函数&#xff1a; 结果&#xff1a;

HTML 【实用教程】(2024最新版)

核心思想 —— 语义化 【面试题】如何理解 HTML 语义化 ?仅通过标签便能判断内容的类型&#xff0c;特别是区分标题、段落、图片和表格 增加代码可读性&#xff0c;让人更容易读懂对SEO更加友好&#xff0c;让搜索引擎更容易读懂 html 文件的基本结构 html 文件的文件后缀为 …

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期&#xff0c;全国多地暴雨持续&#xff0c;“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜&#xff0c;让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑&#xff0c;潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法&#xff1a; 1、将资源附件解压缩&#xff0c;里面的文件夹&#xff0c;放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio&#xff0c;等aa…

BUUCTF[PWN][fastbin attack]

fastbin_attack例题 题目&#xff1a;[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap) 整体思路&#xff1a;利用编辑时edit_heap函数的栈溢出漏洞&#xff0c;覆盖heaparray中的栈指针指向free的got表&#xff0c;将其改为system的plt表&…

make工具

1、什么是make&#xff1f; make是个命令&#xff0c;是个可执行程序&#xff0c;是个工具&#xff0c;用来解析Makefile文件的命令&#xff0c;这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

Linux_实现简易日志系统

目录 1、认识可变参数 2、解析可变参数 3、打印可变参数 3.1 va_list 3.2 va_start 3.3 va_arg 3.4 va_end 3.5 小结 4、实现日志 4.1 日志左半部分 4.2 日志右半部分 4.3 日志的存档归类 结语 前言&#xff1a; 在Linux下实现一个日志系统&#xff0c;该日…

Open3D 删除点云中重叠的点(方法二)

目录 一、概述 1.1原理 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2处理后点云 3.3数据对比 一、概述 在点云处理中&#xff0c;重叠点&#xff08;即重复点&#xff09;可能会对数据分析和处理的结果产生负面影响。因此&#xff0c;删除重叠点是点云预处理中常…

一招解决找不到d3dcompiler43.dll,无法继续执行代码问题

当您的电脑遇到d3dcompiler43.dll缺失问题时&#xff0c;首先需要了解d3dcompiler43.dll文件及其可能导致问题的原因&#xff0c;之后便可以选择合适的解决方案。在此&#xff0c;我们将会为您提供寻找d3dcompiler43.dll文件的多种处理方法。 一、d3dcompiler43.dll文件分析 d…

【C++第十课 - stack_queue】stack、queue的使用、适配器模型stack、queue和priority_queue的底层实现、deque

目录 一、stack使用1、push2、pop3、empty4、top题目1、最小栈2、栈的压入、弹出序3、逆波兰表达式求值 二、queue的使用priority_queue习题 三、适配器stack的底层实现queue的底层实现priority_queue的底层实现仿函数/函数对象函数指针 四、deque 一、stack使用 stack是个容器…

【74LS163做24进制计数器】2021-11-19

缘由用74LS163做24进制计数器-其他-CSDN问答,仿真multisim两个74LS163芯片如何构成47进制计数器-吐槽问答-CSDN问答 参考74ls163中文资料汇总&#xff08;74ls163引脚图及功能_内部结构图及应用电路&#xff09; - 电子发烧友网

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度 能看懂就行&#xff0c;绝大多数情况不需要真正的编程(shellcode题除外) 其实有时候也不需要读汇编&#xff0c;ida F5 通常都是分析gadget&#xff0c;知道怎么用&#xff0c; 调试程序也不需要分析每一条汇编指令&#xff0c;单步执行然后查看寄存器状态即可 但…

【Python机器学习】模型评估与改进——多分类指标

多分类问题的所有指标基本是上都来自于二分类问题&#xff0c;但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。同样&#xff0c;如果类别是不平衡的&#xff0c;精度并不是很好的评估度量。 想象一个三分类问题&#xff0c;其中85%的数据点属于类别…

Java(七)——多态

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎&#xff0c;其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说&#xff0c;更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时&#xff0c;其…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中&#xff0c;重叠点&#xff08;即重复点&#xff09;可能会对数据分析和处理的结果产生负面影响。因此&#xff0c;删除重叠点是点云预处理中常见且重要的步骤。…