c#基础08(数组)

文章目录

数组

数组概念

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个于难诉,最高的地址对应最后一个元素。

声明数组

语法:

c# 复制代码
datatype[] arrayName;
  • datatype 用于指定被存储在数组中的元素的类型。

  • 指定数组的秩(维度)。秩指定数组的大小。

  • arrayName 指定数组的名称。

例如:

c# 复制代码
double[] arr;

初始化数组

声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。

数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

示例:

c# 复制代码
double[] arr = new double[10];

赋值给数组

您可以通过使用索引号赋值给一个单独的数组元素,比如:

c# 复制代码
double[] arr = new double[10];
arr[0] = 6.66;

您可以在声明数组的同时给数组赋值,比如:

c# 复制代码
double[] arr = {2.03,6.99,66.6};

您也可以创建并初始化一个数组,比如:

c# 复制代码
int[] buf = new int[2]{20,30};

在上述情况下,你也可以省略数组的大小,比如:

c# 复制代码
int[] buf = new int[]{5,54,95,421};

当您创建一个数组时,C# 编译器会根据数组类型隐式初始化每个数组元素为一个默认值。例如,int 数组的所有元素都会被初始化为 0。

访问数组元素

元素是通过带索引的数组名称来访问的。

例如:

c# 复制代码
int a = arr[1];
int b = arr[2];
//更改数组的值
arr[3] = 5;
//循环遍历数组
for(int i =0 ;i < arr.length;i++)
{
    //打印数组的值到控制台
    Console.WriteLine(arr[i]);
}

示例:

c# 复制代码
static void Main(string[] args)
{
    int[] n = new int[10];
    int i,j;
    
    //初始化数组n中的元素
    for(i = 0;i < 10;i++)
    {
        n[i] = i + 100;
    }
    
    //输出每个数组元素的值
    for(j = 0;j < 10;j++)
    {
        Console.WriteLine($"{j},{n{j}}");
        Console.ReadKey();
    }
}

集合

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。

各种集合类和它们的用法

描述和用法
动态数组(ArrayList) 它代表了可被单独索引 的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。
哈希表(Hashtable) 它使用 来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键值对。键用于访问集合中的项目。
排序列表(SortedList) 它可以使用索引来访问列表中的项。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。
堆栈(Stack) 它代表了一个后进先出 的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入 元素,当您从列表中移除一项时,称为弹出元素。
队列(Queue) 它代表了一个先进先出 的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队 ,当您从列表中移除一项时,称为出队
点阵列(BitArray) 它代表了一个使用值 1 和 0 来表示的二进制 数组。当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。

动态数组(ArrayList)

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

ArrayList 类的方法和属性

下表列出了 ArrayList 类的一些常用的 属性

属性 描述
Capacity 获取或设置 ArrayList 可以包含的元素个数。
Count 获取 ArrayList 中实际包含的元素个数。
IsFixedSize 获取一个值,表示 ArrayList 是否具有固定大小。
IsReadOnly 获取一个值,表示 ArrayList 是否只读。
IsSynchronized 获取一个值,表示访问 ArrayList 是否同步(线程安全)。
ItemInt32 获取或设置指定索引处的元素。
SyncRoot 获取一个对象用于同步访问 ArrayList。

下表列出了 ArrayList 类的一些常用的 方法

序号 方法&描述
1 public virtual int Add( object value ); 在 ArrayList 的末尾添加一个对象。
2 public virtual void AddRange( ICollection c ); 在 ArrayList 的末尾添加 ICollection 的元素。
3 public virtual void Clear(); 从 ArrayList 中移除所有的元素。
4 public virtual bool Contains( object item ); 判断某个元素是否在 ArrayList 中。
5 public virtual ArrayList GetRange( int index, int count ); 返回一个 ArrayList,表示源 ArrayList 中元素的子集。
6 public virtual int IndexOf(object); 返回某个值在 ArrayList 中第一次出现的索引,索引从零开始。
7 public virtual void Insert( int index, object value ); 在 ArrayList 的指定索引处,插入一个元素。
8 public virtual void Remove( object obj ); 从 ArrayList 中移除第一次出现的指定对象。

示例:

c# 复制代码
static void Main(string[] args)
{
    ArrayList al = new ArrayList();
    Console.WriteLine("添加元素");
    al.Add(45);
    al.Add(10);
    al.Add(2);
    al.Add(4);
    al.Add(90);
    
    Console.WriteLine("数组容量{0}",al.Capacity);
    Console.WriteLine("实际个数{0}",al.Count);
    
    foreach(int i in al)
    {
        Console.WriteLine(i);
    }
    al.Sort();
}

使用foreach循环

在前面的实例中,我们使用一个 for 循环来访问每个数组元素。您也可以使用一个 foreach 语句来遍历数组。

示例:

c# 复制代码
static void Main(string[] args)
{
    ArrayList arr = new ArrayList();
    arr.Add(2);
    arr.Add(40);
    arr.Add(20);
    arr.Add(25);
    arr.Add(58);
    arr.Add(23);
    Console.WriteLine("动态数组的容量为:{0}",arr.Capacity);
    Console.WriteLine("动态数组的实际元素个数为:{0}",arr.Count);

    //遍历数组
    foreach (int i in arr)
    {
        Console.WriteLine(i);

    }

    //排序
    arr.Sort();

    foreach (int i in arr)
    {
        Console.WriteLine(i);
    }

}

C#数组细节

在 C# 中,数组是非常重要的,且需要了解更多的细节。下面列出了 C# 程序员必须清楚的一些与数组相关的重要概念:

概念 描述
多维数组 C# 支持多维数组。多维数组最简单的形式是二维数组。
传递数组给函数 您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
参数数组 这通常用于传递未知数量的参数给函数。
多维数组

c#支持多维数组,多维数组又称为矩形数组

示例:

c# 复制代码
string[,] names;//二维数组
c# 复制代码
int [,,] m;//三维数组

二维数组

初始化

c# 复制代码
int[,] a = new int[3,4]
{
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};

访问二维数组元素

二维数组中的元素是通过使用下表(即数组的行索引和列索引)来访问的。

c# 复制代码
int val = a[2,3];
c# 复制代码
static void Main(string[] args)
{
    int[,] a = new int[5,2]{{0,0},{1,2},{2,4},{3,6},{4,8}};
	int i,j;
    
    //输出数组中每个元素的值
    for(i = 0;i < 5;i++)
    {
        for(j = 0;j < 2;j++)
        {
            Console.WriteLine(a[i,j]);
        }
    }
    Console.ReadKey();
}	
传递数组给函数

在 C# 中,您可以传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。

c# 复制代码
public static double getAverage(int[] arr,int size)
{
    int i;
    double avg;
    int sum = 0;
    
    for(i = 0;i < size;i++)
    {
        sum += arr[i];
    }
    
    avg = (double)sum/size;
    return avg;
}

static void Main(string[] args)
{
    MyArray app = new MyArray();
    int[] balance = new int[]{1000,2,3,10,50};
    double avg;
    
    avg = getAverage(balance,5);
    
    Console.WriteLine(avg);
    Console.ReadKey();
    
    
}
参数数组

有时,当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

params关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:

c# 复制代码
public 返回类型 方法名称( params 类型名称[] 数组名称 )
c# 复制代码
public static int AddElements(params int[] arr)
{
    int sum = 0;
    foreach(int i in arr)
    {
        sum += i;
        
    }
    
    return sum;
    
    
}


static void Main(string[] args)
{
    ParamArray app = new ParamArrray();
    int sum = app.AddElements(512,720,250,567,889);
    Console.WriteLine(sum);
    Console.ReadKey();
}
相关推荐
EIP低代码平台6 小时前
EIP低代码平台-系统参数配置详解|落地三级等保+高灵活私有化部署方案
低代码·c#·权限·工作流·netcore
王莎莎-MinerU7 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
-银雾鸢尾-8 小时前
C#中Object类内的方法
开发语言·c#
geats人山人海10 小时前
c# 第九章 record
开发语言·c#
-银雾鸢尾-11 小时前
C#中的抽象类与抽象方法
开发语言·c#
影寂ldy12 小时前
C# Task 进阶:WaitAll / WaitAny / WhenAll / WhenAny
开发语言·c#
咏方舟【长江支流】12 小时前
【编程】(1)-跨平台跨语言C#、Java、鸿蒙ArkTS三端通用实体接口
java·c#·ai编程·harmonyos·arkts·咏方舟-长江支流·用宝框架
o52788318413 小时前
校园一体化管理系统2.1、基于整洁四层架构 + DDD+CQRS 项目目录解读
后端·架构·c#·asp.net·visual studio