C# 数组和元组

一、数组

在 C# 中,数组(Arrays)是一种用于存储相同类型元素的集合。数组在内存中是连续分配的一块空间,您可以使用索引来访问和操作数组中的元素。以下是有关 C# 数组的一些重要概念和用法:

二、简单数组

在C#中,简单数组是一种基本的数据结构,用于存储相同类型的元素。以下是如何声明、初始化和使用简单数组的示例:

声明数组:

// 声明一个整数数组
int[] intArray;

// 声明一个字符串数组
string[] stringArray;

初始化数组:

// 初始化整数数组并指定大小
intArray = new int[5];

// 初始化字符串数组并指定初始值
stringArray = new string[] { "apple", "banana", "orange" };

访问数组元素:

// 访问整数数组中的第一个元素
int firstElement = intArray[0];

// 访问字符串数组中的第二个元素
string secondElement = stringArray[1];

修改数组元素:

// 修改整数数组中的第三个元素
intArray[2] = 10;

// 修改字符串数组中的第一个元素
stringArray[0] = "mango";

获取数组长度:

// 获取整数数组的长度
int length1 = intArray.Length;

// 获取字符串数组的长度
int length2 = stringArray.Length;

遍历数组:

// 遍历整数数组
foreach (int num in intArray)
{
    Console.WriteLine(num);
}

// 遍历字符串数组
foreach (string fruit in stringArray)
{
    Console.WriteLine(fruit);
}

简单数组是一种常见的数据结构,可以用于存储和处理一组相同类型的数据。使用简单数组可以更轻松地管理数据,并通过索引访问和修改数组中的元素。

三、多维数组

多维数组是在C#中用于存储多维数据的一种数据结构。与交错数组不同,多维数组是在一个数组中以矩阵形式存储数据。C#支持二维、三维,甚至更高维度的数组。

// 声明和初始化一个二维整数数组
int[,] multiIntArray = new int[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };

// 访问二维数组中的元素
int element = multiIntArray[1, 0]; // 获取第二行第一列的元素值(即 3)

四、交错数组

交错数组(Jagged Arrays)是指数组的数组。它允许在数组的每个元素中存储另一个数组。这种类型的数组在C#中是支持的,并且可以方便地处理多维数据。

以下是如何声明、初始化和使用交错数组的示例:

(一) 声明交错数组:

// 声明一个交错数组,包含3个子数组
int[][] jaggedArray;

(二) 初始化交错数组:

// 初始化交错数组并指定每个子数组的大小
jaggedArray = new int[3][];

// 初始化每个子数组
jaggedArray[0] = new int[] { 1, 2, 3 };
jaggedArray[1] = new int[] { 4, 5 };
jaggedArray[2] = new int[] { 6, 7, 8, 9 };

(三) 访问交错数组元素:

// 访问第一个子数组的第一个元素
int firstElement = jaggedArray[0][0]; // 值为 1

// 访问第二个子数组的第二个元素
int secondElement = jaggedArray[1][1]; // 值为 5

(四) 修改交错数组元素:

// 修改第三个子数组的第三个元素
jaggedArray[2][2] = 10;

(五) 获取交错数组长度:

// 获取交错数组的长度(即子数组的数量)
int length = jaggedArray.Length;

// 获取第一个子数组的长度
int firstArrayLength = jaggedArray[0].Length;

(六) 遍历交错数组:

// 遍历交错数组
foreach (int[] subArray in jaggedArray)
{
    foreach (int num in subArray)
    {
        Console.Write(num + " ");
    }
    Console.WriteLine();
}

交错数组在处理不规则或动态大小的数据集时非常有用。每个子数组可以有不同的长度,这使得交错数组在某些情况下比多维数组更灵活。

(七) 多维和交错对比

特点

多维数组

交错数组

存储方式

数据以矩阵形式存储在单个数组中,每个维度的大小必须提前确定

数组的每个元素是一个单独的数组,子数组的大小可以不同

声明方式

int[,] array;

int[][] array;

初始化方式

array = new int[3, 3];

array = new int[3][];

访问方式

array[0, 0] = 1;

array[0][0] = 1;

行和列的长度

所有维度的大小必须一致

不同子数组的长度可以不同

访问性能

访问性能较高,因为数据在内存中是连续存储的

访问性能较低,因为数据在内存中不一定是连续存储的

内存分配

一次性分配所有空间

分别为每个子数组分配空间

适用场景

表格形式的数据,如图像数据、游戏地图等

不规则或动态大小的数据集,如不规则矩阵、数据流等

五、数组作为参数

// 方法接受整数数组作为参数
public void ProcessIntArray(int[] array)
{
    // 处理数组
}

// 调用方法并传递整数数组
int[] myArray = new int[] { 1, 2, 3 };
ProcessIntArray(myArray);

六、对比List

功能

数组

List<T>

声明和初始化

快速

相对较慢(需要动态分配内存)

动态大小调整

不支持

支持,但可能涉及重新分配内存和复制元素

添加元素

不支持

Add操作的性能较差,可能需要重新分配内存

删除元素

不支持

Remove操作的性能较差,可能需要重新分配内存

访问元素

快速

快速

迭代器

快速

快速

长度

快速

快速

多维数组

支持

不支持

排序

使用Array.Sort()方法

使用List.Sort()方法或者OrderBy()方法

查找元素

使用Array.IndexOf()方法

使用IndexOf()方法或者Contains()方法

总的来说,在访问元素方面,数组性能可能略优List<T>,因为数组是连续的内存块,而List<T>可能因为动态分配内存而导致元素不连续。但是在添加和删除元素方面,List<T>的性能较差,因为可能需要重新分配内存和复制元素。

七、元组

C# 中的元组是一种可以包含多个不同类型元素的数据结构。在之前的版本中,C#没有原生的元组支持,但从C# 7.0版本开始,引入了元组的语言特性。

创建元组

你可以使用以下方法创建元组:

1、使用Tuple类:

var tuple = Tuple.Create(1, "hello", true);

2、使用语言特性直接创建:

var tuple = (1, "hello", true);

访问元组元素

你可以通过索引或者元素名称来访问元组中的元素:

var tuple = (1, "hello", true);
int firstItem = tuple.Item1; // 通过索引访问
string secondItem = tuple.Item2;
bool thirdItem = tuple.Item3;

// 或者通过元素名称访问(C# 7.0及以上版本支持)
var (num, str, flag) = tuple;

元组的命名元素

从C# 7.0开始,你可以为元组的元素命名:

var tuple = (num: 1, str: "hello", flag: true);
Console.WriteLine(tuple.num); // 输出:1
Console.WriteLine(tuple.str); // 输出:hello
Console.WriteLine(tuple.flag); // 输出:True

元组作为方法的返回值

元组可以作为方法的返回值,方便返回多个值:

public (int, string) GetValues()
{
    return (42, "hello");
}

// 调用该方法
var result = GetValues();
int number = result.Item1;
string message = result.Item2;

元组的解构

C# 7.0及以上版本支持元组的解构,可以直接将元组的元素分配给多个变量:

var tuple = (1, "hello", true);
var (num, str, flag) = tuple;
Console.WriteLine(num); // 输出:1
Console.WriteLine(str); // 输出:hello
Console.WriteLine(flag); // 输出:True

使用命名元组

C# 7.0及以上版本支持使用ValueTuple来创建命名元组:

var namedTuple = (num: 1, str: "hello", flag: true);
Console.WriteLine(namedTuple.num); // 输出:1
Console.WriteLine(namedTuple.str); // 输出:hello
Console.WriteLine(namedTuple.flag); // 输出:True

这些是C#中使用元组的基本方法和用法。元组通常用于在方法之间传递多个值,或者在某些情况下,如果方法需要返回多个值时使用。

(一) 优势

元组在C#中具有一些优势,使其成为处理和传递多个值的有力工具:

1、轻量级: 元组是一种轻量级的数据结构,不需要额外的类或结构定义。这使得在需要返回或传递临时性数据时,元组成为一个非常方便的选择。

2、方便性: 元组可以在需要返回多个值的地方被直接使用,而不必依赖于定义新的类型或结构。这使得代码更加紧凑和易于理解。

3、语言集成: C# 7.0及以上版本提供了对元组的原生支持,包括元组的创建、解构、命名等操作。这使得元组的使用更加方便和直观。

4、灵活性: 元组可以包含不同类型的元素,因此可以用于返回或传递不同类型的数据。这种灵活性使得元组成为一种处理异构数据的有力工具。

5、匿名性: 元组可以匿名使用,不需要为其定义名称,因此可以在不需要重复使用的地方直接创建和使用。这使得代码更加简洁和清晰。

6、解构功能: C# 7.0及以上版本支持元组的解构功能,可以方便地将元组的元素分配给多个变量,从而简化了代码编写和处理过程。

总的来说,元组在C#中提供了一种简单、灵活、方便的方式来处理和传递多个值,使得代码更加清晰、紧凑和易于维护。

posted @ 2024-03-19 16:34  咸鱼翻身?  阅读(301)  评论(0编辑  收藏  举报