《随笔三十八》——C#中的 “ 解析Array类 中的属性与方法”

本文详细介绍了C#中的Array类,包括其属性如Length、Rank,以及方法如BinarySearch、Clear、Copy等。Array类提供了丰富的操作数组的功能,如搜索、排序、复制和修改数组元素。了解这些属性和方法对于高效地使用C#数组至关重要。
摘要由CSDN通过智能技术生成

目录

Property

Array.ICollection.Count:

Array.Length 

 Array.Rank

Method

Array.BinarySearch (静态方法)

Array.Clear:

Array.Clone 

Array.Copy

Array.CopyTo

Array.CreateInstance

Array.Exists

Array.Find

Array.GetLength

Array.GetValue

Array.IndexOf

Array.GetLowerBound

Array.GetUpperBound

Array.LastIndexOf

Array.Resize

Array.Reverse

Array.SetValue

Array.Sort


点击进入官网了解 Array 更多成员详情信息


Propertys


Array.ICollection.Count:

获取 Array 中包含的元素的个数。

int System.Collections.ICollection.Count { get; }

Array.Length 

获取 Array 的中所有的元素个数

public int Length { get; }

 Array.Rank

获取 Array 的秩(维数)。 例如,一维数组返回 1,二维数组返回 2,依次类推。

public int Rank { get; }
 static void Main(string[] args)
        {
            int[] array1 = new int[10];
            int[,] array2 = new int[10, 3];
            int[,,] array3 = new int[10, 3,3];

            Console.WriteLine("{0}: {1} 维数组", array1.ToString(), array1.Rank);
            Console.WriteLine("{0}: {1} 维数组", array2.ToString(), array2.Rank);
            Console.WriteLine("{0}: {1} 维数组", array3.ToString(), array3.Rank);
        }

输出:
System.Int32[]: 1 维数组
System.Int32[,]: 2 维数组
System.Int32[,,]: 3 维数组

Methods


Array.BinarySearch (静态方法)

该方法有很多重载形式

public static int BinarySearch (Array array, object value);
  • 在 array 数组中搜索 一个 名为 value 的值。
  • 在 array 中允许重复元素。 如果Array包含多个等于 value 的元素,则该方法仅返回其中一个匹配项的索引,而不一定返回第一个匹配项的索引。
  • null 总是可以与任何其他引用类型进行比较; 因此,与null的比较不会产生异常。
  • 此方法为 O (log n) 操作,其中nLengtharray
  • 如果 参数 array 为 null。 抛出 ArgumentNullException
  • 如果参数 array 是多维的。抛出  RankException
  • 如果参数 value 的类型与 array 的元素不兼容。抛出 ArgumentException
  • value 不实现 IComparable 接口,并且搜索遇到不实现 IComparable 接口的元素。抛出 InvalidOperationException

如果找到 value,那么返回 该 value 在数组中 的索引;否则为负整数。(具体看代码)

  • 如果找不到的 value 是小于该数组中的所有元素,那么返回的索引值是该数组中已排序的元素下标为 0  的位置。
  • 如果找不到的 value 是大于该数组中的所有元素, 那么返回索引值是 该数组中已排序的元素的最后一个元素下标值 + 1;
  • 如果找不到的 value 刚好即不大于所有元素也不小于所有元素,那么返回的是数组中第一个 比 value 大的元素的索引值。
  •  如果使用非排序数组调用此方法,则返回值可能不正确,并且可能返回负数,就算该数组中存在 value 也会返回负数。
       static void Main(string[] args)
        {          
            Array myIntArray = Array.CreateInstance(typeof(Int32), 5);
            myIntArray.SetValue(8, 0);
            myIntArray.SetValue(2, 1);
            myIntArray.SetValue(6, 2);
            myIntArray.SetValue(3, 3);
            myIntArray.SetValue(7, 4);
           Array.Sort(myIntArray); //想使用 BinarySearch 方法查找元素,最好使用 Sort 方法对元素进行排序,否则会出现意外结果
            foreach (var tt in myIntArray)
            {
                WriteLine(tt);
            }

            object locationValue = 1; 
            int myIndex1 = Array.BinarySearch(myIntArray, locationValue);
            if (myIndex1 < 0)
            {
                WriteLine($"找不到该对象{locationValue},下一个索引位置是{~myIndex1}");
            }
            else
            {
                WriteLine($"找到该对象,为数字{myIntArray}, 在数组的索引位置{myIndex1}");
            }
            WriteLine();

            object myObjectEven = 25; 
            int myIndex = Array.BinarySearch(myIntArray, myObjectEven);
            if (myIndex < 0)
            {            
                WriteLine($"找不到该对象{myObjectEven},下一个索引位置是{~myIndex}");
            }
            else
            {             
                WriteLine($"找到该对象,为数字{myIntArray}, 在数组的索引位置{myIndex}");
            }
            WriteLine();


            object sValue = 4;
            int myIndex4 = Array.BinarySearch(myIntArray, sValue);
            if (myIndex4 < 0)
            {
                WriteLine($"找不到该对象{sValue},下一个索引位置是{~myIndex4}");
            }
            else
            {
                WriteLine($"找到该对象,为数字{sValue}, 在数组的索引位置{myIndex4}");
            }
            WriteLine();


            object searchValue = 6; 
            int myIndex3 = Array.BinarySearch(myIntArray, searchValue);
            if (myIndex3 < 0)
            {
                WriteLine($"找不到该对象{searchValue},下一个索引位置是{~myIndex3}");
            }
            else
            {
                WriteLine($"找到该对象,为数字{searchValue}, 在数组的索引位置{myIndex3}");
            }
            WriteLine();

Array.Clear:

public static void Clear (Array array, int index, int length);
  • 从 名为 array 数组中的 index 处的位置开始清空 length 个 元素类型。被清空的元素被设置为该元素类型的默认值
  • 如果参数 array 为 null。抛出 ArgumentNullException 异常。
  • 如果 参数 index 小于 0。抛出 IndexOutOfRangeException 异常。
  • 如果 参数 length 小于0。抛出 IndexOutOfRangeException 异常
  • 如果  index + length 大于 array 的大小。抛出 IndexOutOfRangeException 异常
  • 此方法为 O (n) 操作,其中nlength
  • 此方法将数组中的每个元素重置为元素类型的默认值。 它将引用类型(包括String 对象)的元素设置为null,并将值类型的元素设置为下表中显示的默认值。 
  • 注意: 此方法仅清除元素的值;  它不会删除元素本身。 数组具有固定大小;  因此,不能添加或删除元素。
类型
Boolean false
所有整型和浮点数值类型 0 (零)
DateTime DateTime.MinValue
其他值类型 该类型字段的默认值
static void Main(string[] args)
        {
            int[] numbers1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            // 从 numbers1 数组中索引2的位置开始清空元素,一共向后清空5个元素,被清空的元素都在相应的位置都初始化为0
            Array.Clear(numbers1, 2, 5);
            foreach (var tt in numbers1)
            {
                Write(tt);
            }
            WriteLine();

            int[,] numbers2 = { { 11, 22, 33 }, { 44, 55, 66 }, { 77, 88, 99 } };
            Array.Clear(numbers2, 2, 5);
            foreach (var tt in numbers2)
            {
                Write(tt);
            }

            WriteLine();

            int[,,] numbers3 = {
   {
   {1, 2}, {3, 4}},
                             {
   {5, 6}, {7, 8}},
                             {
   {9, 10}, {11, 12}}};
            Array.Clear(numbers3, 2, 5);
          
            foreach (var tt in numbers3)
            {
                Write(tt);
            }
        }

Array.Clone 

public object Clone ();

Clone 方法为数组进行浅复制,也就是说,它只创建了数组本身的克隆。 对于类型数组和引用类型数组而言,有不同的结果。

此方法为 O (n) 操作,其中nLength

  • 克隆值类型数组会得到两个独立的数组。
  • 克隆引用类型数组会导致两个数组指向相同的对象。

Clone方法返回 object类型的引用,该引用必须强制转换为数组类型

下列代码克隆一个值类型数组的示例,它产生了两个独立的数组

namespace HelloWorld_Console
{
  
    class Program
    {
      
        static void Main(s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值