C#中的集合

一、集合的概念

数组可以保存多个对象,但在某些情况下无法确定到底需要保存多少个对象,由于数组的长度不可变,因此数组将不再适用。
如何保存数目不确定的对象呢?
为了保存这些数目不确定的对象,C#中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,统称为集合

集合分类:
可分为非泛型集合泛型集合,二者均间接实现了IEnumerable接口。
(1)非泛型集合
非泛型集合位于System.Collections命名空间,它可以存储多种类型的对象,其中最常用的是ArrayList集合和Hashtable集合。
(2)泛型集合
泛型集合位于System.Collections.Generic命名空间,它只能存储同一种类型的对象,其中最常用的是List < T > 泛型集合和 Dictionary<TKey,TValue> 泛型集合。

二、非泛型集合类ArrayList

ArrayList可以容纳不同类型的对象
这些对象包括int、string、object等类型的对象
同时也提供一系列添加、删除、修改和查询元素等操作方法

int Add(object value)	|将元素添加到ArrayList集合,并且该元素可以是null,且允许重复值,返回值为所插入位置的索引值
void AddRange(ICollection c)	|将集合或者数组添加到ArrayList集合
void Clear()	|从ArrayList中移除所有元素
bool Contains(object item)	|判断某元素是否在ArrayList中
int IndexOf(object value)	|查找指定元素,并返回该元素在ArrayList中第一个匹配项的索引
void Insert(int index,object value)	|将元素插入ArrayList的指定索引处
int LastIndexOf(object value)	|查找指定元素,并返回该元素在ArrayList中最后一个匹配项的索引
void Remove(object obj)	|从ArrayList中移除指定元素的第一个匹配项
void RemoveAt(int index)|从ArrayList中移除指定索引处的元素
void Reverse()	|将整个ArrayList中元素的顺序反转
void Sort()	|对整个ArrayList中的元素进行排序,由小到大
            //创建ArrayList集合对象arrArrayList arr = new ArrayList();//使用不同方法向集合添加多个元素arr.Add(222);arr1.AddRange(new ArrayList() { "小明", "小红" });arr1.Insert(2, 'a');

集合的长度就是元素的个数,集合的容量是随集合长度变化而变化的。如果集合的长度在1-5之间。容量的值就是5。

三、foreach循环

虽然for循环可以用于遍历集合中的元素,但写法上比较繁琐,foreach在遍历时无需循环条件

 foreach (var item in collection)
{执行语句;
}
item变量用于存储每次遍历的元素(默认情况下item为var类型),in为关键字,collection是被遍历的集合。

foreach循环的次数是由元素的个数决定的,每一次循环时,foreach中都通过变量将当前循环中的元素记住,从而将集合中的元素遍历输出。

可以说foreach循环是专门用于遍历数组和集合的循环语句。

但注意,foreach循环只能对遍历到的元素进行读操作,且之能单向遍历,也就是一个元素在整个foreach循环内只能被访问一次。

Hashtable集合——非泛型集合类

在ArrayList集合中查找某个元素时,是从索引位置为0的元素开始逐一进行比对的,这样的查询效率很低,为此C#提供了一个Hashtable集合,该集合又被称为键值对集合。

void Add(object key,object value)	将带有指定键和值的元素添加到Hashtable中
void Clear()	从Hashtable中移除所有元素
bool Contains(object key)	判断Hashtable中是否包含指定的键
bool ContainsValue(object value)	判断Hashtable是否包含指定的值
void Remove(object key)	从Hashtable中移除带有指定键的元素

在Hashtable集合中的键和值的默认类型都是object,因此可以向键和值中添加任意类型的对象。在遍历Hashtable集合时,除了可以通过键来获取对应的值以外,还可以直接遍历集合的值或者集合对象

           Hashtable ht = new Hashtable();//调用Hashtable的Add()方法来添加元素ht.Add(1, "小张");ht.Add(2, "小赵");ht.Add(3, "小钱");//使用foreach语句来循环遍历集合中的值foreach (object value in ht.Values){Console.WriteLine("当前遍历到的值为:" + value);}Console.WriteLine();//使用foreach语句来循环遍历集合对象本身foreach (DictionaryEntry dicEn in ht){Console.Write(dicEn.Key + ":" + dicEn.Value + "\n");}Console.ReadKey();在遍历集合对象本身时,集合对象是DictionaryEntry类型,通过该类型的对象dicEn既可以获得键,也可以获得值。

List泛型集合

ArrayList集合与Hashtable集合可以存储多种类型的元素,由于集合中的元素类型不一致,在很多情况下,使用foreach循环获取集合中的元素时,需要对它们进行强制类型转换,这种操作大大降低了程序的执行效率。

C#中提出了泛型集合的概念,泛型集合相当于与集合制定了某个限制条件,这个条件使集合中只能存储一种类型的元素。

List< T > 是一种常用的泛型集合,T值某种数据类型,如int、string等,该集合不仅具备ArrayList集合的功能,而且还可以保证List< T >集合只能添加同类型元素,不会出现类型转换的问题。

除此以外,List< T >泛型集合不仅具有ArrayList集合的方法,而且还具有一些特有方法,如Max()、Min()、Sum()方法等

 List<int> list = new List<int>(new int[] { 1, 2, 3, 4, 5, 6 });
//获取集合中的最大值
int max = list.Max();
//获取集合中的最小值
int min = list.Min();
//获取集中元素的总和
int sum = list.Sum();

Dictionary<Tkey,TValue>泛型集合

Hashtable集合中的键与值在默认情况下都是object类型,这使得用户在取值时不可避免的遇到类型转换的问题,因此C#提供了Dictionary<Tkey,TValue>泛型集合,该集合中的键和值都只能是一种类型。

Dictionary<int, string> dic = new Dictionary<int, string>();//通过遍历集合中的键获取对应的值foreach (int key in dic.Keys)//通过遍历键值对的方式来获取键与值
foreach (KeyValuePair<int, string> kv in dic)

Dictionary<Tkey, TValue >集合的键值对类型为KeyValuePair<int,string> ,通过该类型的对象就可以获取集合中的键和值。

自定义泛型

在程序开发中,如果List< T > 泛型集合和Dictionary<Tkey,TValue>泛型集合都不能满足实际需求,还可以自定义泛型。自定义泛型可以根据用户的不同需求,灵活的设计属性和方法。
语法格式如下:
[修饰符] class类名<类型占位符>
{
程序代码
}

自定义泛型与普通类的语法格式相似,唯一的区别就是多了一个类型占位符。类型占位符通常用T来表示,可以自行修改,但要遵循变量的命名规范。

  static void Main(string[] args){//创建自定义泛型对象myClassMyClass<string> myClass = new MyClass<string>();//调用Add()方法添加一个元素myClass.Add("小小");Console.WriteLine("自定义泛型中的元素:" + myClass.Get());Console.ReadKey();}}//自定义泛型MyClass<T>class MyClass<T>{T myElement;  //定义一个T类型字段public void Add(T elem)  //创建Add()方法,指定参数类型为T{this.myElement = elem;}public T Get()  //创建Get()方法,指定返回类型为T{return this.myElement;}
}

首先在定义MyClass< T >类中,设置类型占位符为T。在Main()方法中实例化对象myClass时,通过< string >将T指定为string类型。

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

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

相关文章

Unity坦克大战开发全流程——开始场景——排行榜数据逻辑

开始场景——排行榜数据逻辑 排行榜单条数据 排行榜列表 然后在数据管理类中声明一个对应的字段 初始化数据 然后再在上一节课所编写的UpdatePanelInfo函数中处理数据更新的逻辑 时间换算算法 然后再在数据管理类中编写一个在排行榜中添加数据的方法以提供给外部 直到当前RankI…

【BERT】深入理解BERT模型1——模型整体架构介绍

前言 BERT出自论文&#xff1a;《BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来&#xff0c;在自然语言处理领域&#xff0c;BERT模型受到了极为广泛的关注&#xff0c;很多模型中都用到了BERT-base或者是BE…

搜索算法和推荐算法、广告算法的区别

广告和推荐算法的技术框架比较相似&#xff0c;在线计算时都分为召回&#xff08;candidates generating&#xff09;和排序&#xff08;candidates ranking&#xff09;两个阶段&#xff08;这似乎是计算资源有限条件下&#xff0c;所有检索问题的通用架构&#xff09;。 在某…

2024年网络安全竞赛-页面信息发现任务解析

页面信息发现任务说明: 服务器场景:win20230305(关闭链接)在渗透机中对服务器信息收集,将获取到的服务器网站端口作为Flag值提交;访问服务器网站页面,找到主页面中的Flag值信息,将Flag值提交;访问服务器网站页面,找到主页面中的脚本信息,并将Flag值提交;访问服务器…

RabbitMQ详解

RabbitMQ 概念 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。它是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计&#xff0c;基于此协议的客户端与消息中间件可传递消息&a…

2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题)

2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题) 2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题) 第一部分&#xff1a;数据安全防护(30%) 第二部分&#xff1a;数据安全管理(30%) 第三部分&#xff1a;数据安全处置(40%) 项目介绍…

C#常用类

一、C#常用类 C#中有一些具有特定功能的类&#xff0c;例如操作字符串的类、用于操作日期的类、生成随机数的类 字符串的基本特征 1、字符串的不可变性 字符串对象一旦创建&#xff0c;就无法对其进行修改。 .NET框架的底层提供了一种机制&#xff0c;当一个字符串已经被创建…

React Native 从类组件到函数组件

1. 发展趋势 React Native社区中的趋势是朝向使用函数组件&#xff08;Functional Components&#xff09;和Hooks的方向发展&#xff0c;而不是使用类组件&#xff08;Class Components&#xff09;。 React Native自推出Hooks API以来&#xff0c;函数组件和Hooks的使用变得…

【JavaEE】多线程(7) -- 线程池的概念和简单实现

目录 1.线程池是什么 2.标准库中的线程池 2.1ThreadPoolExecutor 2.2构造方法参数介绍 2.3拒绝策略(面试易考) 2.4Executor的使用 3.实现线程池 1.线程池是什么 线程池是一种用来管理线程的机制&#xff0c;它可以有效地控制线程的创建、复用和销毁&#xff0c;从而提高程…

程序的编译、链接

目录 前言&#xff1a; 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言&#xff1a; 在ANSI C的任何一种实现中&#xff0c;存在两种不同的环境&#xff0c;第1种是翻译环境&#x…

EE Vocabulary(电气工程词汇库)

前言 整理了一些EE&#xff08;电子工程&#xff09;和CS&#xff08;计算机&#xff09;专业的学生们阅读英文文献或写论文常用的一些词汇。 仓库GitHub地址&#xff1a;https://github.com/Phillweston/EE_Vocabulary 内容 仓库包含以下格式的电气工程词汇&#xff1a; …

GPT-5、开源、更强的ChatGPT!OpenAI公布2024年计划

年终岁尾&#xff0c;正值圣诞节热闹气氛的OpenAI写下了2024年的发展清单。 OpenAI联合创始人兼首席执行官Sam Altman在社交平台公布&#xff0c;AGI&#xff08;稍晚一些&#xff09;、GPT-5、更好的语音模型、更高的费率限制&#xff1b; 更好的GPTs&#xff1b;更好的推理…

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、 55. 跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机II_哔哩哔哩_bi…

大数据- Hadoop入门

目录 &#x1f436;2.1 hadoop的简介 1. 概述 2. 什么是分布式&#xff1f; 3. Hadoop的指代 &#x1f436;2.2 hadoop的发展历程 &#x1f436;2.3 hadoop的版本介绍 &#x1f436;2.4 hadoop的常用端口号 &#x1f436;2.5 hadoop的设计目的 &#x1f436;2.6 hadoo…

Java集合/泛型篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、说说List,Set,Map三者的区别二、Array与ArrayList有什么不一样?三、Map有什么特点四、集合类存放于 Java.util 包中, 主要有几 种接口前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

upload-labs Pass-03(黑名单验证,特殊后缀)问题纠正

php任何后缀名解析 背景&#xff1a;为了验证php解析不依靠后缀名&#xff0c;可以是任何后缀名&#xff0c;纠正upload-labs Pass-03&#xff08;黑名单验证&#xff0c;特殊后缀&#xff09;里所说的几个固定的后缀名理论是错误的。1 部署1.1 环境准备1.1.1 系统、内核&#…

【音视频 ffmpeg 学习】 跑示例程序 持续更新中

环境准备 在上一篇文章 把mux.c 拷贝到main.c 中 使用 attribute(unused) 消除警告 __attribute__(unused)/** Copyright (c) 2003 Fabrice Bellard** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated docu…

计算机毕业设计-----ssm流浪狗领养系统

项目介绍 我国的动物管理正处于起步阶段&#xff0c;注册在线的宠物数量非常有限&#xff0c;信息也很封闭&#xff0c;因此必须发挥民间力量扩容&#xff0c;加强宠物信息的宣传力度&#xff0c;使更多爱护动物的好心人可以领养宠物&#xff0c;同时也就收纳有家宠物信息&…

Efficient Classification of Very Large Images with Tiny Objects(CVPR2022补1)

文章目录 Two-stage Hierarchical Attention SamplingOne-stageTwo-Stage内存需求 Efficient Contrastive Learning with Attention Sampling Two-stage Hierarchical Attention Sampling 一阶段缩放是hw&#xff0c;提取的特征是h1w1&#xff0c; 二阶段缩放是uv&#xff08;…

Mongodb聚合操作中的$type

在mongodb查询语句中&#xff0c;用户可以通过指定$type值&#xff0c;查询出的符合字段类型的文档数据。在mongodb聚合操作中&#xff0c;也存在$type操作符。本文就聚合操作中的$type进行介绍。 定义 返回一个表示传入参数BSON类型的字符串。在聚合操作中&#xff0c;按照下…