C#中集合和索引器

目录

一、集合

1.IEnumerable和IEnumerator接口

(1)示例:通过自定义集合存储商品信息

2.List和IList 

(1)示例1

(2)示例2

二、索引器

1.索引器与属性的区别

2.示例:通过索引器访问元素


一、集合

        .NET提供了一种称为集合的数据类型,类似于数组,是一组组合在一起的类型化对象,可以通过遍历获取其中的每个元素。相对于数组,它的存储空间是动态变化的,可以对其中的数据进行添加、删除、修改等操作。

        集合需要使用System.Collections命名空间的集合接口来实现。该空间提供的常用的接口及说明:

接口

描述

ICollection

定义所有非泛型集合的大小、枚举数和同步方法

Icomparer

公开一种比较两个对象的方法

IDictionary

表示键/值对的非通用集合

IDictionaryEnumerator

枚举非泛型字典的元素

IEnumerable

公开枚举数,该枚举数支持在非泛型集合上进行简单迭代

IEnumerator

支持对非泛型集合的简单迭代

IList

表示可按照索引单独访问得对象的非泛型集合

1.IEnumerable和IEnumerator接口

        IEnumerable接口用于公开枚举数,该枚举数支持在非泛型集合上进行简单迭代(迭代就是循环遍历,重复执行同一过程)。IEnumerable接口有一个GetEnumerator()方法,用来返回循环访问集合的枚举器。迭代集合时使用。

IEnumerable接口定义:
public interface IEnumerableGetEnumerator()方法定义:
IEnumerator GetEnumerator()

        在实现 IEnumerable接口的同时,还需要实现 IEnumerator接口。该接口支持对非泛型集合的简单迭代。它包括3个成员,分别是Current属性、MoveNext()方法和Reset()方法。

object Current{get}    //获取集合中当前位置元素
bool MoveNext()        //迭代集合中的下一个元素
void Reset()           //设置为初始位置,位于集合中第一个元素的前面

(1)示例:通过自定义集合存储商品信息

        继承 IEnumerable和IEnumerator接口并定义一个集合来存储商品信息,遍历输出集合中的商品信息。

// 集合
using System.Collections;namespace _06
{public class Goods(string code, string name)        //定义集合中的元素类,表示商品信息类{public string Code = code;                      //编号public string Name = name;                      //名称}public class JHClass : IEnumerable, IEnumerator     //定义集合类{private readonly Goods[] _goods;                //初始化Goods类型的集合public JHClass(Goods[] gArray)                  //使用带参构造函数赋值{_goods = new Goods[gArray.Length];for (int i = 0; i < gArray.Length; i++){_goods[i] = gArray[i];}}IEnumerator IEnumerable.GetEnumerator() //实现IEnumerable接口中GetEnumerator方法{return (IEnumerator)this;}int position = -1;                      //记录索引位置object IEnumerator.Current              //实现IEnumerator接口中的Current属性{get{return _goods[position];}}public bool MoveNext()                  //实现IEnumerator接口中的MoveNext方法{position++;return (position < _goods.Length);}public void Reset()                     //实现IEnumerator接口中的Reset方法{position = -1;                      //指向第一个元素}}class Program{static void Main(){Goods[] goodsArray =[new("T0001", "HuaWei MateBook"),new("T0002", "荣耀V30 5G"),new("T0003", "华为平板电脑"),];                                   //初始化Goods类型的集合JHClass jhList = new(goodsArray);    //使用数组创建集合类对象foreach (Goods g in jhList)          //遍历集合,此处Goods类不是集合Goods[]Console.WriteLine(g.Code + " " + g.Name);Console.ReadLine();}}
}
//运行结果:
/*
T0001 HuaWei MateBook
T0002 荣耀V30 5G
T0003 华为平板电脑    */

2.List和IList 

         List和IList之间的主要区别在于List是一个具体的类,它表示可以由索引访问的对象的列表;而IList是一个接口,它表示可以由索引访问的对象的集合。IList接口由两个接口实现,它们是ICollection和IEnumerable。

(1)示例1

// IList接口及与List的比较
namespace _IList
{class IList_Program{static void Main(string[] args){IList<string> ilist =   ["Mark","John"];                          //IList可以由索引访问的对象的集合List<string> list = [];     //List可以由索引访问的对象的列表list.Add("Mark");list.Add("John");foreach (string lst in list){Console.WriteLine(lst);}Console.WriteLine();Console.WriteLine("---对比---");Console.WriteLine();foreach (string lst in ilist){Console.WriteLine(lst);}Console.ReadLine();}}
}
//运行结果:
/*
Mark
John---对比---Mark
John    */

(2)示例2

IList Interface (System.Collections) | Microsoft Learn  

https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.ilist?view=net-8.0

二、索引器

        C#支持一种名为索引器的特殊“属性”,索引器允许一个对象可以像数组一样被索引。索引器的声明方式与属性相似。

1.索引器与属性的区别

  •  索引器在声明时需要使用this关键字定义参数,而属性不需要。
  •  索引器的名称必须是关键字this,this之后一对[],在[]之间指定索引的参数列表,其中必须至少有一个参数。
  • 索引器不能被定义为静态的,定义时不能使用static关键字。可用的修饰符有new、public、protected、internal、private、virtual、sealed、override、abstract、extern。
  • 索引器的使用方式不同于属性的使用方式,需要使用元素访问运算符[],并在其中指定参数进行引用。
  • 当索引器声明包含extern修饰符时,称为外部索引器,由于外部索引器声明不提供任何实现,所以它的每个索引器声明都由一个分号组成。
[修饰符][类型]this[参数列表]
{get{get访问器体}set{set访问器体}
}

2.示例:通过索引器访问元素

         定义一个类,在类中声明索引器,在Main()方法中创建类的对象,通过索引器为数组元素赋值,遍历数组元素。

// 通过索引器访问类元素
namespace _07
{/// <summary>/// 创建类并在其中声明索引器/// </summary>class CollClass{public const int SIZE = 4;         //表示数组的长度private readonly string[] arrStr;  //声明数组public CollClass()                 //构造方法{arrStr = new string[SIZE];     //设置数组的长度}public string this[int index]      //定义索引器{get{return arrStr[index];      //通过索引器取数组元素值}set{arrStr[index] = value;     //通过索引器给数组元素赋值}}}class Program{/// <summary>/// 通过索引器访问类中的元素/// </summary>static void Main(string[] args){CollClass cc = new();    //创建CollClass类的对象=数组cc[0] = "CSharp";        //通过索引器给数组元素赋值cc[1] = "ASP.NET";       //通过索引器给数组元素赋值cc[2] = "Python";        //通过索引器给数组元素赋值cc[3] = "Java";          //通过索引器给数组元素赋值for (int i = 0; i < CollClass.SIZE; i++)          //遍历所有的元素{Console.WriteLine("cc[{0}] = {1}", i, cc[i]); //通过索引器取值}Console.Read();}}
}
//运行结果:
/*
cc[0] = CSharp
cc[1] = ASP.NET
cc[2] = Python
cc[3] = Java        */

        其它常用接口的用法及示例待作者完成创作和测试后逐渐发布。

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

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

相关文章

leetcode:反转链表

题目描述 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL&#xff0c;n2指向head&#xff0c;n3指向第二个结点 当n2不为NULL的时候&#xff0c;让n2->ne…

2023年中国雷达设备市场规模及市场份额分析[图]

雷达设备行业是一种利用无线电波对目标进行探测和定位的技术&#xff0c;也被称为无线电探测和定位。雷达通过发射电磁波对目标进行照射并接收其回波&#xff0c;经波形处理后获取目标的位置和速度等信息。雷达具有探测距离远&#xff0c;测定精度高&#xff0c;不受天气和地形…

设计模式-访问者模式-笔记

Visitor模式 动机&#xff08;Morivation&#xff09; 在软件构建过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为&#xff08;方法&#xff09;&#xff0c;如果直接在基类中做这样的更改&#xff0c;将会给子类带来很繁重的变更负担&am…

汇编基础知识

1.1 机器语言 机器语言就是一些二进制代码&#xff0c;存放在内存中。它是机器指令的集合&#xff0c;所谓机器指令就是机器能够正确执行的命令 1.2 汇编语言的产生 1.汇编语言的主体是汇编指令 2.汇编指令实际上就是机器指令的助记符。它们的唯一区别在于书写方式上 寄存器…

React+后端实现导出Excle表格的功能

最近在做一个基于Reactantd前端框架的Excel导出功能&#xff0c;我主要在后端做了处理&#xff0c;这个功能完成后&#xff0c;便总结成一篇技术分享文章&#xff0c;感兴趣的小伙伴可以参考该分享来做导出excle表格功能&#xff0c;以下步骤同样适用于vue框架&#xff0c;或者…

nginx安装之后修改配置无效

这个问题排查了一晚上&#xff0c;配置怎么改都无效。原本以为错误信息在控制台就能告诉我们&#xff0c;但有些错误信息它都放在日志。查看了日志才发现是没有权限引起的。 这种情况一般是防火墙引起的。可以临时关闭防火墙测试一下 输入如下命令 setenforce 0 如果您使用的…

(vue)前后端配合实现文件预览功能

(vue)前后端配合实现文件预览功能 1.页面&#xff1a; 2.后台返回数据&#xff1a; 3.预览效果&#xff1a; 4.代码&#xff1a; <el-descriptions-item><template slot"label">文件名称</template><el-button type"text" click"…

【开源】基于Vue.js的婚恋交友网站

项目编号&#xff1a; S 057 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S057&#xff0c;文末获取源码。} 项目编号&#xff1a;S057&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新…

C语言三位数求解(ZZULIOJ1076:三位数求解)

题目描述 已知xyzyzzn&#xff0c;其中n是一个正整数&#xff0c;x、y、z都是数字&#xff08;0-9&#xff09;&#xff0c;编写一个程序求出x、y、z分别代表什么数字。如果无解&#xff0c;则输出“No Answer”注意&#xff1a;xyz和yzz表示一个三位数&#xff0c;而不是表示x…

Leetcode刷题之有效的括号(C语言版)

Leetcode刷题之有效的括号&#xff08;C语言版&#xff09; 一、题目描述二、题目测试用例三、题目分析四、完整代码 一、题目描述 20、有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是…

文件上传绕过

1.file_put_contents 路径漏洞 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) { //php stristr()函数 语法作用&#xff1a;…

LED Driver数码屏应用解决方案

今天给大家介绍的产品是LED Driver&#xff0c;这属于电源管理类芯片&#xff0c;一般分为恒流驱动与恒压驱动&#xff0c;但是常见的就是恒流驱动&#xff0c;能够保持产品在驱动中提供恒定且稳定的电流。 基本概述 TM1629是一种带键盘扫描接口的LED&#xff08;发光二极管显…

Vellum —— 简介

目录 一&#xff0c;介绍 二&#xff0c;原理 三&#xff0c;PBD算法 一&#xff0c;介绍 Vellum是一个解算模拟框架&#xff0c;使用更高级的PBD&#xff08;XPBD&#xff0c;extended position based dynamics&#xff09;&#xff0c;是2nd Order Integration&#xff08…

Java生成一个区域内的经纬度随机点的方式

准备&#xff1a; 1、四个角点&#xff08;四个点确定一个框&#xff09; 2、想要细分程度 &#xff08;这里说的是经纬度&#xff0c;这里没有对经纬度做更细的区分&#xff09; 如&#xff1a;0.000001约等于0.1m&#xff0c;0.00001约等于1m&#xff0c;0.0001约等于10m 。。…

JavaScript作用域

一、什么是作用域&#xff1f; 作用域指一个变量的作用范围。 每个作用域都是一个独立的地盘&#xff0c;目的就是为了保证当前作用域内的变量不会外泄&#xff0c;且不会和其他作用域中的同名变量冲突。 在JavaScript中的作用域类型 全局作用域函数作用域(局部作用域)块级…

MongoDB——索引(单索引,复合索引,索引创建、使用)

MongoDB索引 官方文档 https://docs.mongodb.com/manual/indexes/#create-an-index 默认索引 _id index Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey&#xff0c;这个 index 无法被删除 单个字段索引 单字段索引是 Mongo…

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…

什么款式的蓝牙耳机跑步不容易掉?推荐几款很不错的运动耳机

​如果你正在寻找一款性能卓越、佩戴舒适的耳机&#xff0c;那么运动耳机绝对是你的不二选择。它们不仅具备出色的音质&#xff0c;还具备防水、防汗、防震等多项特点&#xff0c;让你在运动时更加尽情享受音乐。接下来给大家推荐几款很不错的运动耳机。 1.南卡开放式运动耳机…

cmake 升级

您好&#xff0c;这是Bing。您的问题是如何解决cmake的版本过低的错误。我可以给您一些建议。请看以下的方法&#xff1a; 您可以通过apt命令来卸载当前的cmake版本&#xff0c;然后从官网下载最新的cmake安装包&#xff0c;解压并编译安装。具体的步骤如下1&#xff1a; 检查…

南京数字孪生赋能工业制造,加速推进制造业数字化转型

随着南京信息技术的迅猛发展和工业管理的不断演进&#xff0c;传统的工业管理方式已经无法满足企业对高效、智能和可持续发展的需求。针对这一情况&#xff0c;数字孪生技术应运而生&#xff0c;为南京工业管理带来了全新的变革和机遇。以数字孪生为理念&#xff0c;三维可视化…