【C#学习笔记】数组和索引器

这篇具有很好参考价值的文章主要介绍了【C#学习笔记】数组和索引器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C#学习笔记】数组和索引器,C#学习笔记,c#,学习,笔记


数组

数组具有以下属性:

  • 数组可以是一维、多维或交错的。
  • 创建数组实例时,将建立纬度数量和每个纬度的长度。 这些值在实例的生存期内无法更改。
  • 数值数组元素的默认值设置为0,而引用元素设置为 null。
  • 交错数组是数组的数组,因此其元素为引用类型且被初始化为 null。
  • 数组从零开始编制索引:包含 n 元素的数组从 0 索引到 n-1。
  • 数组元素可以是任何类型,其中包括数组类型。
  • 数组类型是从抽象的基类型 Array 派生的引用类型。 所有数组都会实现 IList 和 IEnumerable。可以使用 foreach 语句循环访问数组。 单维数组还实现了 IList 和 IEnumerable。

数组可以静态定义,也可以隐式定义

单维数组

int[] array = new int[5];
int[] array1 = new int[] { 1, 3, 5, 7, 9 }; // 定长为5,不是动态的
int[] array2 = { 1, 3, 5, 7, 9 }; // 定长
string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

多维数组

与其他语言定义数组不同,定义多维数组使用的是[,],其中每多一个问号多一个维度。在C#中[][]并不是定义的多维数组,而是交错数组,也就是数组中的数组。

int[,] array = new int[4, 2]; //4 * 3 的二维数组
int[,,] array1 = new int[4, 2, 3]; // 4 * 2 * 3 的三维数组

显式定义多维数组的时候,必须全部定义完。

int[,] array2Da = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
string[,] array2Db = new string[3, 2] { { "one", "two" }, { "three", "four" },
                                        { "five", "six" } };

隐式定义

int[,,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
                                 { { 7, 8, 9 }, { 10, 11, 12 } } };

不指定级别也能定义

int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

交错数组

交错数组被称为数组中的数组,其内部往往定义了多个数组。

下列定义了一个交错数组,第一个[]定义了内部有三个数组,第二个[]定义了内部数组的维度,这里只有一维

int[][] jaggedArray = new int[3][];
// 初始化,数组只需维度相同,元素数不定
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
// 上述定义和下面语句相同
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

还可以在声明时初始化

// 交错数组new声明的第一个[]不定义数量
// 但是new声明的第二个[]必须定义维度数量
int[][] jaggedArray2 = new int[][]
{
new int[] { 1, 3, 5, 7, 9 },
new int[] { 0, 2, 4, 6 },
new int[] { 11, 22 }
};
// 定义的二维交错数组
int[][,] jaggedArray3 = new int[][,]
{
new int[,] { { 1,2 }, { 3,3 }}
;

也可以不用new来声明:

// 不使用new声明,定义时也需要数组同维度
int[][] jaggedArray4 =
{
    new int[] { 1, 3, 5, 7, 9 },
    new int[] { 0, 2, 4, 6 },
    new int[] { 11, 22 }
};

指定元素数和数组维度定义多维数组的例子

int[][,] jaggedArray5 = new int[3][,]
{
    new int[,] { {1,3}, {5,7} },
    new int[,] { {0,2}, {4,6}, {8,10} },
    new int[,] { {11,22}, {99,88}, {0,9} }
};

索引器

使用索引器,其目的是为了访问类中非public的数组类。并且可以自定义访问索引的get方法和set方法。索引器可以被定义在类和接口上。

索引器及其参数的类型必须至少具有和索引器相同的可访问性。索引器值不能按引用(作为 ref 或 out 参数)传递。

类上的索引器

方法1

class Parent
{
    string[] s = { "123", "222" };
    public string this[int index]
    {
        get
        {
            return s[index];
        }
        set
        {
            s[index] = value;
        }
    }
}
void Start()
{
    Parent p = new Parent();
    Debug.Log(p[1]); // 222
    p[1] = "555"; // 输入值默认value
    Debug.Log(p[1]); // 555
}

使用索引器,用于访问类中的元素(一般是数组元素,通常通过index访问,但是也可以用于其他需要使用序号的情况,例如使用序号来访问int型中的第n个数字,当然也能访问枚举类型。)。

上述的索引器,可以用=>设置get和set方法:

class Parent
{
    string[] s = { "123", "222" };
    public string this[int index]
    {
        get => s[index];
        set => s[index] = value;
    }
}

方法2

在下例中,使用索引值来访问索引,下面设置的索引器是只读的,实现了通过索引值来访问索引号的方法。

class DayCollection
{
    string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };
    public int this[string day] => FindDayIndex(day);
    private int FindDayIndex(string day)
    {
        for (int j = 0; j < days.Length; j++)
        {
            if (days[j] == day)
            {
                return j;
            }
        }
        throw new ArgumentOutOfRangeException(
            nameof(day),
            $"Day {day} is not supported.\nDay input must be in the form \"Sun\", \"Mon\", etc");
    }
}
void Start()
{
    DayCollection Days = new DayCollection();
    Debug.Log(Days["Sat"]);
}

使用访问器getset方法来定义索引器(以及其他变量)的可读性和可写性。


接口中的索引器

// Indexer on an interface:
public interface IIndexInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : IIndexInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // indexer declaration
    {
        // The arr object will throw IndexOutOfRange exception.
        get => arr[index];
        set => arr[index] = value;
    }
}

根据上述的例子,接口IIndexInterface中定义了一个索引器,但是接口本身并无int数组。并且接口中定义了get和set权限,则在继承类中必须实现索引器的get和set。因此索引器的读写权限在接口中已经定义了。

IndexerClass继承了该接口,并在接口中定义了索引器的读写访问器。

当继承了多个同名索引器的时候,当然也需要使用完全限定名来定义:文章来源地址https://www.toymoban.com/news/detail-631492.html

string IIndexInterface.this[int index]
{
}

到了这里,关于【C#学习笔记】数组和索引器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch-学习笔记02【ElasticSearch索引库维护】

    Java后端-学习路线-笔记汇总表【黑马程序员】 ElasticSearch-学习笔记01【ElasticSearch基本介绍】 【day01】 ElasticSearch-学习笔记02【ElasticSearch索引库维护】 ElasticSearch-学习笔记03【ElasticSearch集群】 ElasticSearch-学习笔记04【Java客户端操作索引库】 【day02】 ElasticSearch-学习笔记05【Spri

    2024年02月04日
    浏览(44)
  • TypeScript 学习笔记(六):索引签名类型、映射类型

    keyof 可以用于获取某种类型的所有键,其返回类型是联合类型。 keyof 与 Object.keys 略有相似,只不过 keyof 取 interface 的键 通过例子可以看到,这里的keyof Info其实相当于\\\"name\\\" | “age”。通过和泛型结合使用,TS 就可以检查使用了动态属性名的代码: 接口 基本数据类型 类 如果

    2024年02月17日
    浏览(43)
  • 数组(个人学习笔记黑马学习)

      案例描述: 在一个数组中记录了五只小猪的体重 如: int arr[5] =(300,350,200,400,250): 找出并打印最重的小猪体重。   案例描述: 请声明一个5个元素的数组,并且将元素逆置(如原数组元素为: 1,3,2,5,4;逆置后输出结果为:4,5,2,3,1   作用: 最常用的排序算法,对数组内元素进行排序  

    2024年02月10日
    浏览(44)
  • ElasticSearch-学习笔记04【Java客户端操作索引库】

    Java后端-学习路线-笔记汇总表【黑马程序员】 ElasticSearch-学习笔记01【ElasticSearch基本介绍】 【day01】 ElasticSearch-学习笔记02【ElasticSearch索引库维护】 ElasticSearch-学习笔记03【ElasticSearch集群】 ElasticSearch-学习笔记04【Java客户端操作索引库】 【day02】 ElasticSearch-学习笔记05【Spri

    2023年04月09日
    浏览(44)
  • 【学习笔记】树状数组

    树状数组是一种数据结构,普通树状数组维护的信息及运算要满足结合律且可差分。 树状数组是用长度为 (n) 的数组存储的。我们假设这个数组为 (n) ,令 lowbit(i)=i(-i) ,则 (c_i) 保存的是向前 lowbit(i) 长度的 (a) 数组区间和。 单点加:从 (i) 开始,修改所有包含 (a_i)

    2024年02月15日
    浏览(41)
  • 后缀数组学习笔记

    后缀数组就是主要处理字符串后缀问题的,它的实现算法主要有两种:倍增法和 DC3,复杂度分别是 (O(nlog n)) 和 (O(n)) 。这里由于 DC3 代码答辩且难以理解,我就只写了倍增法的实现。 P3809 【模板】后缀排序 读入一个长度为 (n) 的由大小写英文字母或数字组成的字符串,

    2024年02月16日
    浏览(36)
  • 学习笔记-MongoDB(命令增删改查,聚合,权限管理,索引,java使用)

    基础概念 1 什么是mogodb? MongoDB 是一个基于分布式文件/文档存储的数据库,由 C++ 编写,可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的。 MongoDB

    2024年02月08日
    浏览(36)
  • 读SQL学习指南(第3版)笔记08_视图和索引

    3.1.3.1. Oracle Database用户另一种选择可以保护数据表的行列数据安全 3.1.3.2. VPD允许用户对数据表施加策略,服务器据此对用户的查询进行修改 5.10.4.1. sql 5.12.1.1. 平衡树索引(balanced-tree index) 5.12.1.1.1. B树索引(B-tree index) 5.12.1.2. MySQL、Oracle Database和SQL Server均默认采用B树

    2024年02月10日
    浏览(40)
  • C语言学习笔记:数组

    ✨博文作者:烟雨孤舟 💖 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教! 目录 ​​​​​​​ 简介 数组声明 数组初始化 访问数组元素 多维数组 二维数组

    2024年02月09日
    浏览(54)
  • 数据结构学习笔记——多维数组、矩阵

    数组是由n(n≥1)个 相同数据类型 的数据元素组成的有限序列,在定义数组时,会为数组分配一个固定大小的内存空间,用来存储元素,数组在被定义后,其维度不可以被改变。 数组在确定其维度和维界后,元素的个数是固定的,所以不能进行插入和删除运算。数组中最常

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包