C# 集合与泛型

文章目录

前言

    C# 中,集合(Collection)是一组有序的数据结构,用于存储和管理一组对象。泛型(Generics)则是 .NET Framework 中一个强大且灵活的功能,它允许我们创建类型安全且高效的集合。本篇文章将详细介绍 C# 中的集合类型、泛型的使用以及如何结合两者高效管理数据。

1.什么是集合?

    集合是一组可以存储、管理多个数据的对象容器。集合与数组类似,但集合的容量可以动态调整,不必在声明时指定长度。C# 中的集合分为两种类型:

  • 非泛型集合:如 ArrayList、Hashtable,可以存储不同类型的数据,但缺乏类型安全性,需进行频繁的类型转换。
  • 泛型集合:如 List、Dictionary<TKey, TValue>,只能存储指定类型的数据,提供了更好的性能和类型安全性。

2.非泛型集合(了解即可)

     早期的集合类位于 System.Collections 命名空间中,包括 ArrayList、Hashtable 等。非泛型集合由于可以存储不同类型的数据,灵活性较强,但在存储和取出数据时需进行类型转换,且缺乏编译时类型检查,容易出现类型不匹配的错误。

2.1常见的非泛型集合
  • ArrayList:类似数组,但大小可动态调整,存储任何类型的数据。
  • Hashtable:键值对的集合,键和值均可为任意类型。
    示例:使用 ArrayList 和 Hashtable
using System;
using System.Collections;class NonGenericCollections
{static void Main(){// ArrayList 示例ArrayList arrayList = new ArrayList();arrayList.Add(1);arrayList.Add("Hello");arrayList.Add(3.14);foreach (var item in arrayList){Console.WriteLine(item);  // 输出:1, Hello, 3.14}// Hashtable 示例Hashtable hashtable = new Hashtable();hashtable["name"] = "Alice";hashtable["age"] = 25;foreach (DictionaryEntry entry in hashtable){Console.WriteLine($"{entry.Key}: {entry.Value}");}}
}

3.泛型的概念

    泛型(Generics)允许我们在创建类、接口或方法时定义一个或多个类型参数(通常用 表示),并在使用时指定具体的类型。这种机制在运行时提供类型安全检查,避免了频繁的类型转换。
泛型的优点

  • 类型安全:在编译时检查类型一致性,避免类型错误。
  • 性能提升:减少装箱(boxing)和拆箱(unboxing),提高效率。
  • 可读性和可维护性:代码更清晰、直观,不需要强制类型转换。

4.常用的泛型集合

     C# 中常用的泛型集合类位于 System.Collections.Generic 命名空间中。以下是一些常用的泛型集合类:

4.1 List < T > <T> <T>

     L i s t < T > List<T> List<T> 是一种动态数组,可根据需要动态调整大小。List 提供了便捷的方法来操作列表中的元素,如添加、删除、排序、搜索等。

using System;
using System.Collections.Generic;class ListExample
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3 };numbers.Add(4);numbers.Remove(2);foreach (int number in numbers){Console.WriteLine(number);  // 输出:1, 3, 4}// 检查列表中是否包含某个元素bool containsThree = numbers.Contains(3);  // trueConsole.WriteLine("包含3吗?" + containsThree);}
}
4.2 Dictionary<TKey, TValue>

    Dictionary<TKey, TValue> 是一种键值对集合,允许通过键快速访问对应的值。键在字典中是唯一的,但值可以重复。

using System;
using System.Collections.Generic;class DictionaryExample
{static void Main(){Dictionary<string, int> ages = new Dictionary<string, int>{{ "Alice", 25 },{ "Bob", 30 }};ages["Charlie"] = 35;foreach (var pair in ages){Console.WriteLine($"{pair.Key}: {pair.Value}");}// 检查是否存在特定键if (ages.ContainsKey("Alice")){Console.WriteLine("Alice的年龄是: " + ages["Alice"]);}}
}
4.3 Queue < T > <T> <T>

     Q u e u e < T > Queue<T> Queue<T> 是一个先进先出(FIFO)的集合。适合用在需要按顺序处理任务的场景,例如任务队列。

using System;
using System.Collections.Generic;class QueueExample
{static void Main(){Queue<string> queue = new Queue<string>();queue.Enqueue("Task1");queue.Enqueue("Task2");while (queue.Count > 0){string task = queue.Dequeue();Console.WriteLine("处理: " + task);}}
}
4.4 S t a c k < T > Stack<T> Stack<T>

     S t a c k < T > Stack<T> Stack<T> 是一个后进先出(LIFO)的集合。适合用于临时存储数据或实现特定算法(如递归)。

using System;
using System.Collections.Generic;class StackExample
{static void Main(){Stack<string> stack = new Stack<string>();stack.Push("Page1");stack.Push("Page2");while (stack.Count > 0){string page = stack.Pop();Console.WriteLine("返回: " + page);}}
}
4.5 H a s h S e t < T > HashSet<T> HashSet<T>

     H a s h S e t < T > HashSet<T> HashSet<T> 是一个无序集合,用于存储唯一值。适合用于需要唯一元素的场景,如不重复数据的集合。

using System;
using System.Collections.Generic;class HashSetExample
{static void Main(){HashSet<int> set = new HashSet<int> { 1, 2, 3 };set.Add(3); // 重复添加将被忽略set.Add(4);foreach (int item in set){Console.WriteLine(item);  // 输出:1, 2, 3, 4}}
}

5. 自定义泛型类和方法

5.1 自定义泛型类

    可以创建自己的泛型类,使其在不同的数据类型上复用。以下是一个简单的泛型栈实现:

using System;class GenericStack<T>
{private T[] elements;private int index = 0;public GenericStack(int size){elements = new T[size];}public void Push(T item){elements[index++] = item;}public T Pop(){return elements[--index];}
}class Program
{static void Main(){GenericStack<int> stack = new GenericStack<int>(5);stack.Push(1);stack.Push(2);Console.WriteLine(stack.Pop());  // 输出:2}
}
5.2 自定义泛型方法

    泛型方法允许在方法中定义类型参数,使用方式和泛型类类似。以下是一个交换两个变量值的泛型方法示例:

using System;class Program
{static void Swap<T>(ref T a, ref T b){T temp = a;a = b;b = temp;}static void Main(){int x = 10, y = 20;Swap(ref x, ref y);Console.WriteLine($"x = {x}, y = {y}");  // 输出:x = 20, y = 10}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶3D目标检测综述(一)

文章地址&#xff1a;[2206.09474] 3D Object Detection for Autonomous Driving: A Comprehensive Survey (arxiv.org) 这篇综述简单易懂&#xff0c;非常合适对自动驾驶和3D目标检测感兴趣的小白阅读&#xff0c;对相关算法进行初步理解。 目录 一、摘要 &#xff08;一&a…

回归分析学习

学习视频链接&#xff1a; 【回归分析,一套搞定】&#xff01;全网最通俗易懂的回归分析教程&#xff0c;我终于学明白了&#xff01;_哔哩哔哩_bilibili 相关分析&#xff1a;2个或两个以上的变量之间的相关程度及大小的统计方法&#xff1b; 回归分析&#xff1a;存在相关关…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

后端:Aop 面向切面编程

文章目录 1. Aop 初步学习面向切面编程&#xff0c;EnableAspectJAutoProxy2. AOP的核心概念3. 前置通知&#xff08;Before&#xff09;4. 后置通知&#xff08;After&#xff09;5. 返回通知&#xff08;AfterReturning&#xff09;6. 异常通知&#xff08;AfterThrowing&…

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

管家婆财贸ERP BB045.销售批量收款

最低适用版本: 财贸系列 22.8 插件简要功能说明: 销售类单据支持批量收款,简化收款做单流程更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--销售批量收款 插件详细功能文档: 1. 应用中心增加菜单【销售批量收款】 a. 参考23.0应用中心-移动管理-物联宝-【…

基于MATLAB+opencv人脸疲劳检测

我们可以通过多种方式从现实世界中获取数字图像&#xff0c;比如&#xff1a;数码相机、扫描仪、计算机扫描和磁共振成像等等。在这些情况中&#xff0c;虽然我们肉眼看到的是图像&#xff0c;但是当需要将图像在数字设备中变换传输时&#xff0c;图像的每个像素则对应一个数值…

Prompt 工程

Prompt 工程 1. Prompt 工程简介 “预训练-提示预测”范式是近年来自然语言处理&#xff08;NLP&#xff09;领域的一个重要趋势&#xff0c;它与传统的“预训练-微调-预测”范式相比&#xff0c;提供了一种更为灵活和高效的模型应用方式。 Prompt工程是指在预训练的大型语言…

【Python TensorFlow】进阶指南(续篇一)

在前两篇文章中&#xff0c;我们介绍了TensorFlow的基础知识及其在实际应用中的初步使用&#xff0c;并探讨了更高级的功能和技术细节。本篇将继续深入探讨TensorFlow的高级应用&#xff0c;包括但不限于模型压缩、模型融合、迁移学习、强化学习等领域&#xff0c;帮助读者进一…

yolov7论文翻译

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors 论文&#xff1a;https://arxiv.org/abs/2207.02696 代码&#xff1a;https://github.com/WongKinYiu/yolov7 摘要 YOLOv7 在速度和准确性方面均超越了所有已知的目标检测器&a…

Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密&#xff1a;密码学的基石及 RSA 算法详解 在当今数字化的时代&#xff0c;信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术&#xff0c;为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言&#x1f393;一、数据集准备&#x1f393;二、模型训练&#x1f340;&#x1f340;1.初始化&#x1f340;&#x1f340;2.加载数据集&#x1f340;&#x1f340;3.划分数据集&#xff0c;并保存到新的文件夹&#x1f340;&#x1f340;4.可视化数据集&#x1f34…

【webrtc】 RTP 中的 MID(Media Stream Identifier)

RTP 中的 MID(Media Stream Identifier) RID及其与MID的区别 cname与mid的对比【webrtc】CNAME 是rtprtcp中的Canonical Name(规范化名称) 同样都是RTP头部扩展: 基于mediasoup的最新的代码,学习,发现mid在创建RtpSendStream时是必须传递的参数: 例如 D:\XTRANS\soup\…

Node.Js+Knex+MySQL增删改查的简单示例(Typescript)

数据库: CREATE DATABASE MyDB; CREATE TABLE t_users (user_id int(11) NOT NULL,user_name varchar(10) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; 项目结构: package.json如下&#xff0c;拷贝并替换你们本地的package.json后运行 npm install 命令安装所需要的依赖。…

【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 订阅专栏后可以看到完整代码,复制到MATLAB空脚本上面即可直接运行。若需要单独下载,可通过下面的链接:https://download.cs…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介&#xff1a;2. LSTM结构图&#xff1a;3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介&#xff1a; LSTM是一种循环神经网络&#xff0c;它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…