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.mzph.cn/pingmian/59826.shtml

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

相关文章

sql单表查询练习题

1. 查看course表结构的SQL命令是什么&#xff1f; A. SELECT * FROM exam.course; B. \d exam.course; C. \d exam.course; D. DESCRIBE exam.course; 答案&#xff1a;C 2. 使用哪个SQL命令可以查看exam.course表中的所有数据&#xff1f; A. SELECT * FROM e…

京东商品详情API接口获取(jd.item_get)和展示

获取京东商品详情 API 接口主要有以下步骤&#xff1a; 一、注册成为开发者&#xff1a; 注册账号获取key和secret&#xff0c;这是获取 API 访问权限的基础。在京东开放平台中创建一个应用&#xff0c;并填写相关信息&#xff0c;如应用程序名称、应用描述等。 二、申请 API…

数据分析-41-时间序列预测之机器学习方法XGBoost

文章目录 1 时间序列1.1 时间序列特点1.1.1 原始信号1.1.2 趋势1.1.3 季节性和周期性1.1.4 噪声1.2 时间序列预测方法1.2.1 统计方法1.2.2 机器学习方法1.2.3 深度学习方法2 XGBoost2.1 模拟数据2.2 生成滞后特征2.3 切分训练集和测试集2.4 封装专用格式2.5 模型训练和预测3 参…

【LeetCode】【算法】209. 课程表

LeetCode 209. 课程表 题目描述 你这个学期必须选修numCourses门课程&#xff0c;记为0到numCourses- 1 。 在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出&#xff0c;其中 prerequisites[i] [a_i,b_i] &#xff0c;表示如果要学习课程a_i则必须先学…

基于大语言模型的规划

文章目录 整体框架方案生成反馈获取虽然上下文学习和思维链提示方法形式上较为简洁且较为通用,但是在面对诸如几何数学求解、游戏、代码编程以及日常生活任务等复杂任务时仍然表现不佳。为了解决这类复杂任务,可以使用基于大语言模型的规划(Planning)。该方法的核心思想在于…

【一些正经的思考】牵牛花在秋天播种可以开花吗

这是一篇正经的思考&#xff0c;因为是发生在工位上的事情&#xff0c;所以这也是上班记录~ 我入职新公司已经两个月了&#xff0c;和部门的新伙伴出去吃饭的频率高了1000%&#xff0c;不得不说&#xff0c;这边的食堂确实不是那么好吃&#xff0c;就和小伙伴经常去一个在江边…

零基础Java第十四期:继承与多态(二)

目录 一、继承 1.1. 继承的方式 1.2. final关键字 1.3. 继承与组合 1.4. protected关键字 二、多态 2.1. 多态的概念 2.2. 向上转型 2.3. 重写 2.4. 向下转型 2.5. 多态的优缺点 一、继承 1.1. 继承的方式 猫类可以继承动物类&#xff0c;中华田园猫类可以继承猫类…

Django 详细入门介绍

Django 详细入门介绍 1. 什么是 Django&#xff1f; Django 是一个开源的、用 Python 编写的 Web 框架。它遵循了“快速开发”和“不要重复自己”&#xff08;DRY&#xff09;的设计原则&#xff0c;旨在简化复杂的 Web 开发。Django 提供了多种强大的功能模块&#xff0c;如…

RabbitMQ 不公平分发介绍

RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。在 RabbitMQ 中&#xff0c;消息分发策略对于系统的性能和负载均衡至关重要。默认情况下&#xff0c;RabbitMQ 使用公平分发&#xff08;Fair Dispatch&#xff09;策…

WebRTC REMB算法

WebRTC REMB&#xff08;Receiver Estimated Maximum Bitrate&#xff09;是一种带宽估计算法&#xff0c;用于在WebRTC中动态地调整视频发送端的码率&#xff0c;以适应网络带宽的变化。以下是对WebRTC REMB的详细解释&#xff1a; 一、定义与原理 定义&#xff1a;REMB是一…

RocketMQ 广播消息

所谓的广播消息就是发送的一条消息会被多个消费者收到。 ⼴播是向主题&#xff08; topic &#xff09;的所有订阅者发送消息。订阅同⼀个 topic 的多个消费者&#xff0c;能全量收到⽣产者发送的所有消息。 生产者发送了10个order&#xff0c;每个order里面有5个消息&#xff…

.Net IOC理解及代码实现

IOC理解 IoC(Inversion of Control)&#xff1a;即控制反转&#xff0c;这是一种设计思想&#xff0c;指将对象的控制权交给IOC容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对象就可以了。DI(Dependency Injection)&#xff0c;即依…

kafka面试十五题

1、kafka消息发送的流程 消息经过main线程里的拦截器&#xff08;可选&#xff09;、序列化器、分区器。分区器将数据发送到分区中&#xff0c;每个分区创建一个双端队列&#xff08;分区是在内存中完成的&#xff09;&#xff0c;内存总大小为32M&#xff0c;每个批次的大小为…

CSS Position 定位如何使用?

写在前面 在网页设计中&#xff0c;定位元素是非常重要的。CSS 提供了多种定位方式&#xff0c;其中最常用的是 position 属性。position 属性允许你精确地控制元素在页面中的位置和布局。 1. static static 是默认的定位方式&#xff0c;表示元素将按照正常的文档流进行布局…

react的创建与书写

一&#xff1a;创建项目 超全面详细一条龙教程&#xff01;从零搭建React项目全家桶&#xff08;上篇&#xff09; - 知乎 1.创建一个文件夹&#xff0c;shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度&#xff0c;先把npm设置为淘宝镜像地址。 npm config s…

量化交易系统开发-实时行情自动化交易-数据源选择

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 关于数据采集方面&#xff0c;首先聊聊…

【微信小游戏学习心得】

这里是引用 微信小游戏学习心得 简介了解微信小游戏理解2d游戏原理数据驱动视图总结 简介 本人通过学习了解微信小游戏&#xff0c;学习微信小游戏&#xff0c;加深了对前端框架&#xff0c;vue和react基于数据驱动视图的理解&#xff0c;及浏览器文档模型和javaScript之间的关…

【C++】【算法基础】第k个数(分治法)

第k个数 题目 在一个长度为 n n n的整数数列中找到第 k k k大的数。 题解 核心思想同快速排序&#xff08;实际就是快速排序加一个第 k k k大的数会在哪边的判定条件&#xff09;&#xff1a; #include<iostream> using namespace std;int quickSelect(int *a, int …

TVM计算图分割--LayerGroup

文章目录 介绍Layergroup调研TVM中的LayergroupTVM Layergroup进一步优化MergeCompilerRegions处理菱形结构TVM中基于Pattern得到的子图TPUMLIR地平线的Layergroup介绍 Layergroup目前没找到严格、明确的定义,因为不同厂家的框架考虑的因素不同,但是基本逻辑是差不多的。一般…

深究JS底层原理

一、JS中八种数据类型判断方法 在JavaScript中&#xff0c;数据类型分为两大类&#xff1a;基本&#xff08;原始&#xff09;数据类型和引用&#xff08;对象&#xff09;数据类型。 基本数据类型&#xff08;Primitive Data Types&#xff09; 基本数据类型是表示简单的数…