Array类(C#)

C#数组是由System.Array类派生而来的引用对象,可以使用Array类的属性来对数组进行各种操作。

Array类的属性及方法

用方括号声明数组是C#中使用Array类的表示法。在后台使用C#语法,会创建一个派生自抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性。

Array类的属性
属性说明
IsFixedSize获取一个值,该值指示数组是否带有固定大小
IsReadOnly获取一个值,该值指示数据是否只读
Length获取一个32位整数,该值表示所有维度的数组中的元素总数
LongLength获取一个64位整数,该值表示所有维度的数组中的元素总数
Rank获取数组的秩(维度)

Array类的方法
方法描述
Clear根据元素的类型,设置数组中某个范围的元素为零,为false或者为null
Copy(Array,Array,Int32)从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。长度由一个32位整数指定。
Copy(Array,Int32)从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。索引由一个32位整数指定。
GetLength获取一个32位整数,该值表示指定维度的数组中的元素总数
GetLongLength获取一个64位整数,该值表示指定维度的数组中的元素总数
GetLowerBound获取数组中指定维度的下界
GetType获取当前实例的类型。从对象(Object)继承
GetUpperBound获取数组中指定维度的上界
GetValue(Int32)获取一维数组中指定位置的值。索引由一个32位整数指定
IndexOf(Array,Object)搜索指定的对象,返回整个一维数组中第一次出现 的索引
Reverse(Array)逆转整个一维数组中元素的顺序
SetValue(Object,Int32)给一维数组中指定位置的元素设置值。索引由一个32位整数指定
Sort(Array)使用数组的每个元素的IComparable实现来排序整个一维数组中的元素
ToString返回一个表示当前对象的字符串。从对象(Object)继承

数组合并与拆分

数组的拆分与合并并不是针对一个数组进行操作的,而是将两个数组合并到第三个数组中去。在C#中数组的拆分与合并是通过Array类提供的Copy方法实现的。

Copy有四种重载形式:

Copy(Array, Int64, Array, Int64, Int64)        //长度和索引指定为64位整数

Copy(Array, Int32, Array, Int32, Int32)        //长度和索引指定为32位整数

复制Array中的一系列元素(从指定的源索引开始),并将它们粘贴到另一Array中(从指定的目标索引开始)。

Copy(Array, Array, Int64)

Copy(Array, Array, Int32)

从第一个元素开始复制Array中的一系列元素,将它们粘贴到另一个Array中(从第一个元素开始)。

<think> 我们正在讨论C#中的Array。根据用户的要求,我需要详细介绍Array,包括其定义、属性、常用方法以及与其他集合型(如ArrayList)的区别。同时,我会根据引用内容来支持我的回答。 ArrayC#中所有数组的基,位于System命名空间。它提供了一系列用于操作数组的静态方法和属性。虽然我们通常使用方括号语法来声明数组,但实际上这些数组都是Array的实例。 下面我将从几个方面介绍Array: 1. **Array的基本概念**: - Array是抽象,因此不能直接实例化。当我们使用`int[] myArray = new int[5];`这样的语句时,实际上创建了一个派生自Array的具体实例。 - Array支持一维数组、多维数组和交错数组。 2. **Array的常用属性**(引用[2][4]): - `Length`:获取数组所有维度中元素的总数(32位整数)。 - `LongLength`:同上,但返回64位整数,用于非常大的数组。 - `Rank`:获取数组的维度(秩)。 - `IsFixedSize`:获取一个值,该值指示数组是否具有固定大小(数组总是固定大小,所以返回true)。 - `IsReadOnly`:数组是否只读(通常为false,除非是ReadOnlyArray)。 - `IsSynchronized`:指示是否同步(线程安全)访问数组(数组默认不是线程安全的,返回false)。 3. **Array的常用方法**(引用[1][3][4]): - `Clear(Array array, int index, int length)`:将数组中从指定索引开始的一定数量的元素设置为元素型的默认值(对于数值型为0,引用型为null,布尔型为false)。 - `Copy(Array sourceArray, Array destinationArray, int length)`:从源数组复制指定个数的元素到目标数组,从两个数组的索引0开始。 - `CopyTo(Array array, int index)`:将当前一维数组的所有元素复制到指定的一维数组中,从目标数组的指定索引处开始。 - `GetLength(int dimension)`:获取指定维度中的元素数(32位整数)。 - `GetLongLength(int dimension)`:同上,返回64位整数。 - `GetLowerBound(int dimension)`:获取数组中指定维度第一个元素的索引(通常为0,但可以是其他值)。 - `GetUpperBound(int dimension)`:获取数组中指定维度最后一个元素的索引(等于长度-1+下界)。 - `GetValue(int index)`:获取一维数组中指定位置的值。 - `SetValue(object value, int index)`:设置一维数组中指定元素的值。 - `IndexOf(Array array, object value)`:在一个一维数组中搜索指定对象,并返回其首个匹配项的索引(如果没找到则返回-1)。 - `Reverse(Array array)`:反转整个一维数组中元素的顺序。 - `Sort(Array array)`:对一维数组中的元素进行排序(使用元素的自然顺序)。 4. **ArrayArrayList的区别**(引用[2]): - **容量**:数组的容量是固定的,而ArrayList的容量可以根据需要自动扩充。 - **操作**:ArrayList提供添加、删除和插入某一范围元素的方法,而数组只能一次获取或设置一个元素(但Array提供静态方法如Copy、Clear等来操作多个元素)。 - **维度**:ArrayList只能是一维形式,而数组可以是多维的(如二维数组)。 - **型**:数组是强型的(例如`int[]`只能存储整数),而ArrayList存储的是object型,因此可以存放任何型,但需要装箱拆箱。 5. **使用示例**: 下面给出一些使用Array方法和属性的示例: ```csharp // 创建一个一维数组 int[] numbers = { 5, 2, 8, 1, 9 }; // 使用Length属性 Console.WriteLine("数组长度: " + numbers.Length); // 输出:5 // 使用Sort方法排序 Array.Sort(numbers); // 数组变为 [1, 2, 5, 8, 9] // 使用Reverse反转 Array.Reverse(numbers); // 数组变为 [9, 8, 5, 2, 1] // 使用IndexOf查找元素 int index = Array.IndexOf(numbers, 5); // 返回2 // 使用Copy方法复制数组 int[] copy = new int[3]; Array.Copy(numbers, 1, copy, 0, 3); // 从源数组索引1开始复制3个元素到copy数组 // copy数组包含 [8,5,2] // 使用Clear方法 Array.Clear(numbers, 0, 2); // 将numbers数组前两个元素设置为0 // numbers数组变为 [0,0,5,2,1] ``` 6. **注意事项**: - 由于Array是抽象,我们不能直接创建Array的实例,但可以通过`Array.CreateInstance`方法来创建数组,这在编译时不知道数组型的情况下很有用。 - Array提供的方法大多是静态方法,可以直接通过名调用。 综上所述,ArrayC#数组操作的核心,提供了丰富的功能。了解这些属性和方法有助于更高效地处理数组。 §§相关问题§§ 1. C#中如何使用`Array.CreateInstance`创建数组? 2. Array与List<T>相比有何优缺点? 3. 如何对多维数组进行排序? </think> ### C# Array 详解 Array C# 中所有数组的基(位于 `System` 命名空间),它提供了丰富的静态方法和属性来操作数组。以下是对其核心特性和功能的系统介绍: --- #### 一、Array 的本质 1. **数组的底层实现** 当使用方括号声明数组(如 `int[] arr = new int[5];`)时,实际创建的是派生自 `Array` 的实例[^1]。 ```csharp int[] numbers = { 3, 1, 4 }; // 等价于 Array numbers = new int[3] {3,1,4}; ``` 2. **与 ArrayList 的区别** | **特性** | Array | ArrayList | |---------------|-----------------|----------------| | 容量 | 固定大小 | 自动动态扩容 | | 维度支持 | 支持多维数组 | 仅一维 | | 型安全 | 强型(如 `int[]`)| 存储 `object` 型 | | 性能 | 更高(无装箱拆箱) | 更低(需型转换) |[^2] --- #### 二、核心属性 | 属性 | 描述 | 示例 | |----------------------|----------------------------------------------------------------------|-------------------------------| | `Length` | 获取数组总元素数(32位整数) | `numbers.Length` → 3 | | `LongLength` | 获取数组总元素数(64位整数,适用于超大数组) | `numbers.LongLength` → 3 | | `Rank` | 获取数组维度数 | `int[,] matrix = new int[2,3];`<br>`matrix.Rank` → 2 | | `IsReadOnly` | 指示数组是否为只读 | `numbers.IsReadOnly` → false | --- #### 三、关键方法详解 1. **元素操作** ```csharp // 获取/设置元素值 object val = numbers.GetValue(1); // 获取索引1的值 → 1 numbers.SetValue(9, 0); // 设置索引0为9 → [9,1,4] // 查找元素位置 int index = Array.IndexOf(numbers, 4); // 返回值4的索引 → 2 ``` 2. **数组操作** ```csharp // 复制数组 int[] copy = new int[3]; Array.Copy(numbers, copy, 2); // 复制前2个元素 → [9,1,0] // 清空部分元素 Array.Clear(numbers, 1, 2); // 从索引1开始清空2个元素 → [9,0,0] ``` 3. **排序与反转** ```csharp Array.Sort(numbers); // 升序排序 → [0,0,9] Array.Reverse(numbers); // 反转数组 → [9,0,0] ``` 4. **维度操作(多维数组)** ```csharp int[,] matrix = new int[2, 3]; int rows = matrix.GetLength(0); // 第一维长度 → 2 int lowerBound = matrix.GetLowerBound(1); // 第二维起始索引(通常为0) ``` --- #### 四、性能与实践建议 1. **性能优势** - 直接内存操作,无额外开销 - 静态方法经过高度优化,比手动循环更高效 - 适合高性能场景(如游戏开发、科学计算) 2. **使用场景** - 固定大小的数据集合 - 需直接内存操作的底层开发 - 多维数据结构(如图像处理) 3. **局限性** - ❌ 不支持动态扩容(需改用 `List<T>`) - ❌ 频繁插入/删除操作效率低 --- #### 五、实际应用案例 ```csharp // 高效统计数组极值 int[] data = { 12, 15, 6, 23, 8 }; Array.Sort(data); int min = data.GetValue(0); // 最小值 → 6 int max = data.GetValue(data.Length-1); // 最大值 → 23 // 二维数组初始化 Array matrix = Array.CreateInstance(typeof(int), 3, 4); // 创建3x4矩阵 matrix.SetValue(42, 1, 2); // 设置第2行第3列值为42 ``` > 📌 **最佳实践**:优先使用泛型数组(如 `int[]`)而非 `Array` ,仅在需要动态型或反射时使用 `Array`[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值