C# LINQ与集合类 数据操作

news2025/2/9 7:37:25

目录

LINQ语法

过滤数据

投影数据

排序数据

集合操作

聚合操作

分组操作

查找元素

其他操作

常用的集合类

List 

LinkedList 

HashSet

Dictionary

List:动态数组

LinkedList:双向链表

HashSet:唯一无序集合

Dictionary:键值对集合

场景代码示例

总结


集合类和LINQ是 C# 开发者处理数据的核心工具。本文通过一些常用的api简介数据操作。

LINQ语法

定义 

LINQ语法是c#相对其它语言的优势。LINQ (Language Integrated Query) 被定义为一个用于数据查询的功能,它允许开发者通过统一的语法来查询不同类型的数据源,例如集合、数据库等。LINQ 提供了一个集成的查询语言,可以在编译时获得类型检,从而提高代码的可读性和安全性。LINQ 的关键特点包括:

集成查询:LINQ 将查询功能直接集成到 C# 中,而不需要独立的查询语言。这使得查询操作可以像其他编程操作一样嵌入到代码中。

一致的查询模型:无论查询的是集合、数据库、XML 或其他数据源,LINQ 提供了一个一致的查询模型和语法。

强类型和编译时验证:查询条件、投影等都能够在编译时进行类型检查,这减少了运行时错误的风险。

延迟执行:LINQ 查询通常是延迟执行的,只有在实际迭代查询结果时,查询才会被执行。这有助于优化性能,避免不必要的计算。

代码简洁:用简单的方法链实现复杂操作。

通过 LINQ,开发者可以在同一语言中对各种数据源进行复杂的查询操作,显著提高代码的简洁性、可维护性以及开发效率。

常用的方法

示例代码的参数可以简单理解为集合里的某一项,然后进行遍历

过滤数据
方法名功能描述示例代码
Where过滤集合中满足条件的元素numbers.Where(n => n > 5);
OfType<T>过滤出指定类型的元素objects.OfType<int>();

投影数据
方法名功能描述示例代码
Select将集合中的元素映射到新的形式numbers.Select(n => n * 2);
SelectMany将嵌套集合展开并映射students.SelectMany(s => s.Courses);

排序数据
方法名功能描述示例代码
OrderBy按升序排序students.OrderBy(s => s.Age);
OrderByDescending按降序排序students.OrderByDescending(s => s.Age);
ThenBy在 OrderBy 后按另一条件排序students.OrderBy(s => s.Age).ThenBy(s => s.Name);
ThenByDescending在 OrderBy 后按另一条件降序排序students.OrderBy(s => s.Age).ThenByDescending(s => s.Name);

集合操作
方法名功能描述示例代码
Distinct去重numbers.Distinct();
Union合并两个集合并去重numbers1.Union(numbers2);
Intersect取两个集合的交集numbers1.Intersect(numbers2);
Except取两个集合的差集numbers1.Except(numbers2);

聚合操作
方法名功能描述示例代码
Sum求和numbers.Sum();
Average求平均值numbers.Average();
Max求最大值numbers.Max();
Min求最小值numbers.Min();
Count统计元素个数numbers.Count();

分组操作
方法名功能描述示例代码
GroupBy按指定键分组students.GroupBy(s => s.Grade);

查找元素
方法名功能描述示例代码
First返回第一个满足条件的元素numbers.First(n => n > 5);
FirstOrDefault返回第一个满足条件的元素,若无则返回默认值numbers.FirstOrDefault(n => n > 5);
Single返回唯一满足条件的元素numbers.Single(n => n == 5);
SingleOrDefault返回唯一满足条件的元素,若无则返回默认值numbers.SingleOrDefault(n => n == 5);
Last返回最后一个满足条件的元素numbers.Last(n => n > 5);
LastOrDefault返回最后一个满足条件的元素,若无则返回默认值numbers.LastOrDefault(n => n > 5);

其他操作
方法名功能描述示例代码
Any判断集合中是否有满足条件的元素numbers.Any(n => n > 10);
All判断集合中所有元素是否满足条件numbers.All(n => n > 0);
Skip跳过指定数量的元素numbers.Skip(5);
Take获取指定数量的元素numbers.Take(5);
Concat连接两个集合numbers1.Concat(numbers2);
Reverse反转集合numbers.Reverse();

常用的集合类

操作方法

List<T> 

List<T> 是动态数组,提供了丰富的操作方法。

方法名功能描述示例代码
Add添加一个元素到列表末尾list.Add(10);
AddRange添加一个集合到列表末尾list.AddRange(new[] { 20, 30 });
Insert在指定索引处插入一个元素list.Insert(1, 40);
Remove移除第一个匹配的元素list.Remove(10);
RemoveAt移除指定索引处的元素list.RemoveAt(2);
RemoveRange移除指定范围的元素list.RemoveRange(0, 2);
Clear清空列表list.Clear();
Contains判断列表是否包含某个元素list.Contains(10);
IndexOf查找元素的索引list.IndexOf(10);
Find查找第一个匹配的元素list.Find(x => x > 5);
FindAll查找所有匹配的元素list.FindAll(x => x > 5);
Sort对列表进行排序list.Sort();
Reverse反转列表list.Reverse();
Count获取列表的元素数量list.Count;
ToArray将列表转换为数组list.ToArray();

LinkedList<T> 

LinkedList<T> 是双向链表,适合频繁插入和删除操作。

方法名功能描述示例代码
AddFirst在链表头部插入一个元素linkedList.AddFirst(10);
AddLast在链表尾部插入一个元素linkedList.AddLast(20);
AddBefore在指定节点前插入一个元素linkedList.AddBefore(linkedList.First, 30);
AddAfter在指定节点后插入一个元素linkedList.AddAfter(linkedList.First, 40);
RemoveFirst移除链表头部的元素linkedList.RemoveFirst();
RemoveLast移除链表尾部的元素linkedList.RemoveLast();
Remove移除第一个匹配的元素linkedList.Remove(10);
Clear清空链表linkedList.Clear();
Contains判断链表是否包含某个元素linkedList.Contains(10);
Count获取链表的元素数量linkedList.Count;
First获取链表的第一个节点linkedList.First;
Last获取链表的最后一个节点linkedList.Last;

HashSet<T>

HashSet<T>无序唯一的集合,适合需要快速查找、插入和删除的场景。

方法名功能描述示例代码
Add添加一个元素,若已存在则返回 falsehashSet.Add(10);
Remove移除指定元素hashSet.Remove(10);
Clear清空集合hashSet.Clear();
Contains判断集合是否包含指定元素hashSet.Contains(10);
UnionWith并集操作hashSet.UnionWith(otherSet);
IntersectWith交集操作hashSet.IntersectWith(otherSet);
ExceptWith差集操作hashSet.ExceptWith(otherSet);
SymmetricExceptWith对称差集操作(只保留不重叠的元素)hashSet.SymmetricExceptWith(otherSet);
Count获取集合的元素数量hashSet.Count;

Dictionary<TKey, TValue>

Dictionary<TKey, TValue> 是键值对集合,支持通过键快速查找值。

方法名功能描述示例代码
Add添加一个键值对dict.Add("key1", "value1");
Remove移除指定键的键值对dict.Remove("key1");
Clear清空字典dict.Clear();
ContainsKey判断字典是否包含指定键dict.ContainsKey("key1");
ContainsValue判断字典是否包含指定值dict.ContainsValue("value1");
TryGetValue尝试获取指定键的值,返回是否成功dict.TryGetValue("key1", out string value);
Keys获取所有键的集合dict.Keys;
Values获取所有值的集合dict.Values;
Count获取字典的元素数量dict.Count;

方法示例 

List<T>:动态数组

使用场景:元素频繁增删改查,但不要求唯一性。

// 创建并添加元素
List<string> list = new List<string> { "Apple", "Banana" };
list.Add("Cherry");  // 添加到末尾

// 删除元素
list.Remove("Banana");     // 删除第一次出现的元素
list.RemoveAt(0);          // 删除索引位置元素

// 遍历(LINQ格式)
list.ForEach(fruit => Console.WriteLine(fruit)); 
LinkedList<T>:双向链表

使用场景:频繁在两端的插入/删除操作。

LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(10);     // 尾部添加
linkedList.AddFirst(20);    // 头部添加

LinkedListNode<int> node = linkedList.Find(10);
linkedList.AddAfter(node, 15);  // 在节点后插入新值

linkedList.RemoveFirst();  // 删除头节点
HashSet<T>:唯一无序集合

使用场景:去重、集合运算(并集/交集)。

HashSet<int> setA = new HashSet<int> { 1, 2, 3 };
HashSet<int> setB = new HashSet<int> { 3, 4, 5 };

setA.UnionWith(setB);          // 并集:1, 2, 3, 4, 5
setA.IntersectWith(setB);      // 交集:3
setA.ExceptWith(setB);         // 差集:1, 2

bool contains = setA.Contains(3); // 检查是否包含
Dictionary<TKey, TValue>:键值对集合

使用场景:高效查找(通过键)、存储复杂数据。

Dictionary<string, int> ages = new Dictionary<string, int>
{
    { "Alice", 25 },
    { "Bob", 30 }
};

ages["Charlie"] = 35;          // 添加新键值对
ages.Remove("Bob");            // 删除键值对

if (ages.ContainsKey("Alice")) // 检查键是否存在
{
    int age = ages["Alice"];    // 通过键获取值
}

场景代码示例

从列表中筛选并排序

var students = new List<Student>
{
    new Student { Name = "Alice", Age = 20 },
    new Student { Name = "Bob", Age = 22 },
    new Student { Name = "Charlie", Age = 19 }
};

var result = students
    .Where(s => s.Age >= 20) // 筛选年龄 >= 20 的学生
    .OrderBy(s => s.Age)      // 按年龄升序排序
    .Select(s => s.Name);     // 投影名字

统计字符串中每个单词的出现次数

string text = "Hello world! Hello C#!";
var wordCounts = text.Split(' ')
    .GroupBy(word => word)
    .Select(group => new { Word = group.Key, Count = group.Count() });
foreach (var word in wordCounts)
{
    Console.WriteLine($"{word.Word}: {word.Count}");
}

使用 Dictionary 和 LINQ 实现缓存

Dictionary<int, string> cache = new Dictionary<int, string>();
cache[1] = "Value1";
cache[2] = "Value2";

var cachedKeys = cache.Keys.Where(key => key % 2 == 0); // 查找偶数键

总结

集合类和 LINQ 不仅简化了数据的存储和查询,还极大地提升了代码的可读性和开发效率。掌握集合类和 LINQ 能够编写更高效、更易维护的代码。如何高效地管理和处理数据,是每个开发者都需要面对的关键问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具&#xff0c;旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病&#xff0c;通常表现为认知障碍、记忆丧失和语言障碍等症状…

设计模式-生产者消费者模型

阻塞队列&#xff1a; 在介绍生产消费者模型之前&#xff0c;我们先认识一下阻塞队列。 阻塞队列是一种支持阻塞操作的队列&#xff0c;常用于生产者消费者模型&#xff0c;它提供了线程安全的队列操作&#xff0c;并且在队列为空或满时&#xff0c;能够阻塞等待&#xff0c;…

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…

嵌入式硬件篇---OpenMV的硬件流和软件流

文章目录 前言一、硬件流控制&#xff08;Hardware Flow Control&#xff09;1. 基本原理RTSCTS 2. OpenMV中的实现• 硬件要求• 代码配置• 工作流程 二、软件流控制&#xff08;Software Flow Control&#xff09;1. 基本原理XONXOFF 2. OpenMV中的实现• 代码配置• 工作流…

【AIGC提示词系统】基于 DeepSeek R1 + ClaudeAI 易经占卜系统

上篇因为是VIP&#xff0c;这篇来一个免费的 提示词在最下方&#xff0c;喜欢的点个关注吧 引言 在人工智能与传统文化交融的今天&#xff0c;如何让AI系统能够传递传统易经文化的智慧&#xff0c;同时保持易经本身的神秘感和权威性&#xff0c;是一个极具挑战性的课题。本文将…

OpenAI 实战进阶教程 - 第十节 : 结合第三方工具的向量数据库Pinecone

面向读者群体 本节课程主要面向有一定编程基础和数据处理经验的计算机从业人员&#xff0c;如后端开发工程师、数据工程师以及对 AI 应用有浓厚兴趣的技术人员。即使你之前没使用过向量数据库&#xff0c;也可以通过本节的实操内容快速上手&#xff0c;为企业或个人项目构建强…

深入Linux系列之进程地址空间

深入Linux系列之进程地址空间 1.引入 那么在之前的学习中&#xff0c;我们知道我们创建一个子进程的话&#xff0c;我们可以在代码层面调用fork函数来创建我们的子进程&#xff0c;那么fork函数的返回值根据我们当前所处进程的上下文是返回不同的值&#xff0c;它在父进程中返…

AWK系统学习指南:从文本处理到数据分析的终极武器 介绍

目录 一、AWK核心设计哲学解析 1.1 记录与字段的原子模型 1.2 模式-动作范式 二、AWK编程语言深度解析 2.1 控制结构 说明&#xff1a; 2.2 关联数组 代码说明&#xff1a; 示例输入和输出&#xff1a; 注意事项&#xff1a; 2.3 内置函数库 三、高级应用技巧 3.1…

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上&#xff0c;Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径&#xff0c;可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下&#xff1a; 选择新的模型存储目录&#xff1a;首先&#xff0c;确定您希望存储模型的目标目录路…

半导体行业跨网文件交换系统

在当今这个数字化转型的时代&#xff0c;半导体行业作为技术密集型产业&#xff0c;正面临着前所未有的信息安全挑战。随着企业内外网隔离措施的加强&#xff0c;如何实现既安全又高效的跨网文件交换&#xff0c;成为了众多半导体企业的一大难题。 特别是在研发和生产过程中产生…

使用GD32F470的硬件SPI读写W25Q64

代码简单改下引脚定义便可以使用&#xff01; 使用的单片机具体型号&#xff1a;GD32F470ZGT6 简单介绍下W25Q64&#xff1a; /* W25Q64 性能参数 */ /* 容量&#xff1a;8MByte 64Mbit */ /* 有128个块&#xff0c;每个块有64KByte */ /* 每个块有16个扇区&#xff0c;每个…

02为什么 OD门和 OC门输出必须加上拉电阻?

为什么 OD&#xff08;开漏&#xff09;门和 OC&#xff08;开集&#xff09;门输出必须加上拉电阻&#xff1f; 1、首先一点&#xff0c;知道OD是说的MOS管&#xff0c;OC是说的三极管&#xff0c;二者的区别与联系大家应该都懂。 2、以OC门举例&#xff0c;芯片的OC门内部结…

AI方案调研与实践 (不定期补充)

目录 说明 1. AI云主机准备 1.1 Ollama配置 设置模型保存路径 配置模型驻留内存时间 查看GPU状况命令: nvidia-smi 2. Deepseek 2.1 安装与使用 3. LobeChat配置 参考 说明 调研并实例化各种AI方案&#xff0c;探索训练/使用方式的最佳实践。 1. AI云主机准备 可以去一…

人工智能大模型之模型蒸馏与知识蒸馏

一、背景介绍 随着人工智能技术的不断发展&#xff0c;大模型在各个领域的应用也越来越广泛。模型蒸馏&#xff08;Model Distillation&#xff09;和知识蒸馏&#xff08;Knowledge Distillation&#xff09;是两种非常重要的模型压缩技术&#xff0c;它们可以帮助我们将大型…

[手机Linux] onepluse6T 系统重新分区

一&#xff0c;刷入TWRP 1. 电脑下载 Fastboot 工具&#xff08;解压备用&#xff09;和对应机型 TWRP&#xff08;.img 后缀文件&#xff0c;将其放入前面解压的文件夹里&#xff09; 或者直接这里下载:TWRP 2. 将手机关机&#xff0c;长按音量上和下键 开机键 进入 fastbo…

k8s部署elasticsearch

前置环境&#xff1a;已部署k8s集群&#xff0c;ip地址为 192.168.10.1~192.168.10.5&#xff0c;总共5台机器。 1. 创建provisioner制备器&#xff08;如果已存在&#xff0c;则不需要&#xff09; 制备器的具体部署方式&#xff0c;参考我之前的文章&#xff1a;k8s部署rab…

本地部署DeepSeek

下载Docker Docker Desktop: The #1 Containerization Tool for Developers | Docker 下载安装ollama Download Ollama on macOS 下载完成后解压运行 终端输入 Ollama --version 输出对应版本号即为下载成功 如果没有弹出上述图片&#xff0c;浏览器输入http://localhos…

21.[前端开发]Day21-HTML5新增内容-CSS函数-BFC-媒体查询

王者荣耀-网页缩小的问题处理 为什么会产生这个问题&#xff1f;怎么去解决 可以给body设置最小宽度 1 HTML5新增元素 HTML5语义化元素 HTML5其他新增元素 2 Video、Audio元素 HTML5新增元素 - video video支持的视频格式 video的兼容性写法 HTML5新增元素 - audio audio…

nbmade-boot调用deepseek的api过程与显示

希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台 下面简单介绍调用最近大红的AI &#xff1a;deepseek的api过程与显示&#xff0c;包括前后端代码与效果图 一、后端代码 1、几个基础的java类 DeepSeekRequest .java package com.nbcio.demo.do…

Linux:安装 node 及 nvm node 版本管理工具(ubuntu )

目录 方法一&#xff1a;手动下载安装文件安装方法二&#xff1a;curl安装 方法一&#xff1a;手动下载安装文件安装 git clone 远程镜像 git clone https://gitee.com/mirrors/nvm安装 nvm bash install.sh刷新配置&#xff0c;使配置在终端生效 // 方法 1 source /root/.…