C#数组与Array类

C#代码中,可以将一组相同类型的数据定义在数组中,然后进行统一操作,以提高处理效率。本文将讨论C#代码中如何使用数组,以及如何使用Array类处理数组。

数组

C#和.NET Framework中的各种类型,以及自定义类型都可以作为数组元素的基本类型。数组类型需要使用元素类型一对方括号定义,如int[]表示元素为int类型的数组。如果在创建数组时指定元素,可以使用一对花括号定义,如下面的代码。

C#
using System;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] seq = { 1, 1, 2, 3, 5, 8 };
            Console.WriteLine(seq.Length);  // 6
        }
    }
}

代码中,定义了seq数组对象,其元素类型为int,同时指定了数组的成员为6个数值;最后,使用数组对象的Length属性显示数组的元素数量,执行代码会显示6。

下面的代码会创建包含6个元素的数组,并通过索引设置和读取元素数据。

C#
using System;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] seq = new int[6];
            Console.WriteLine(seq[0]);  // 0
            seq[0] = 1;
            seq[1] = 1;
            seq[2] = 2;
            seq[3] = 3;
            seq[4] = 5;
            seq[5] = 8;
            Console.WriteLine(seq.Length);  // 6
            Console.WriteLine(seq[4]);  // 5
        }
    }
}

代码中,首先定义了包含6个int元素的数组,此时元素的默认值就是元素类型的默认值,第一个输出显示了数组第一个元素(索引0)的默认值0。数组中,第一个元素的索引值为0,第二个元素的索引值为1,以此类推,最后一个元素的索引值是元素数量减1。

此外,还可以通过for或foreach语句循环访问并处理数组元素,如下面的代码。

C#
using System;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] seq = { 1, 1, 2, 3, 5, 8 };
            //
            for (int i = 0; i < seq.Length; i++)
                Console.WriteLine(seq[i] * 2);
            Console.WriteLine();
            //
            foreach (int n in seq)
                Console.WriteLine(n * n);
        }
    }
}

Linq扩展方法

引用System.Linq命名空间后,还可以使用一些数组的扩展方法,如下面的代码。

C#
using System;
using System.Linq;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] arr = { 1.0, 2.0, 3.0, 4.0, 5.0 };
            Console.WriteLine(arr.Min());  // 1
            Console.WriteLine(arr.Max());  // 5
            Console.WriteLine(arr.Sum());  // 15
            Console.WriteLine(arr.Average());  // 3
        }
    }
}

代码中,分别使用Min()方法求数组元素的最小值,Max()方法求数组元素的最大值,Sum()方法求数组元素的和,Average()方法求数组元素的平均数。

Array类——查找数组元素

Array类中定义了数组的一系列操作方法,下面分别介绍。

查找元素时可以使用如下方法:

  • IndexOf()方法,查找元素,并返回第一个匹配的索引值。没有找到时返回-1。
  • LastIndexOf()方法,查找元素,并返回最后一个匹配的索引值。没有找到时返回-1。

下面的代码演示了这两个方法的应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1,2,3,2,1 };
            Console.WriteLine(Array.IndexOf(arr, 2));  // 1
            Console.WriteLine(Array.LastIndexOf(arr, 2)); // 3
            Console.WriteLine(Array.IndexOf(arr, 99));  // -1
        }
    }
}

FindAll()方法可以返回满足条件的元素组成的新数组,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1,2,3,2,1 };
            int[] result = Array.FindAll(arr, (x) => x == 2);
            for (int i = 0; i < result.Length; i++)
                Console.WriteLine(result[i]);
        }
    }
}

代码中,FindAll()方法的第二个参数使用Lambda表达式指定查找等于2的元素,并保存到result数组中;结果会显示result数组的元素,即两个2。

查找数组元素的方法还包括:

  • Exists()方法,判断是否存在满足条件的元素,存在时返回true,否则返回false。
  • Find()方法,返回满足条件的第一个元素。
  • FindLast()方法,返回满足条件的最后一个元素。
  • FindIndex()方法,返回第一个满足条件元素的索引,没有找到返回-1。
  • FindLastIndex()方法,返回最后一个满足条件元素的索引,没有找到返回-1。

在这些方法中,参数二除了使用Lambda表达式,还可以通过方法定义查询条件,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arr = { "Tom", "Jerry", "John", "Smith" };
            Console.WriteLine(Array.Exists(arr, Search)); // True
            Console.WriteLine(Array.FindIndex(arr, Search));  // 0
            Console.WriteLine(Array.FindLastIndex(arr, Search));  // 3
            Console.WriteLine(Array.Find(arr, Search)); // Tom
            Console.WriteLine(Array.FindLast(arr, Search)); // Smith
        }
        // 根据关键字查询文本内容
        static bool Search(string s)
        {
            return s.ToLower().Contains("t");
        }
    }
}

代码中定义了Search()方法,其参数为数组元素类型string,返回值定义为bool类型,满足条件的元素返回true,否则返回false。Main()方法中,在Array类的多个方法中使用了Search()方法,并根据方法的实现查找包含字母t的元素。请注意,在Search()方法中,首先将元素文本转换为小写,然后查找字母t,这样就可以忽略字母的大小写,否则,只会匹配Smith,而不能匹配Tom。

Array类——数组元素排序

Array类的Sort()方法可以对数组元素进行排序,默认使用升序排列,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 2,1,3,5,7,8,9 };
            Array.Sort(arr);
            Console.WriteLine(string.Join(",", arr));
        }
    }
}

执行代码会显示“1,2,3,5,7,8,9”。

Sort()方法的第二个参数可以定排列方法,如下面的代码可以实现降序排列。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 2,1,3,5,7,8,9 };
            Array.Sort(arr, (x, y) => y - x);
            Console.WriteLine(string.Join(",", arr));
        }
    }
}

Sort()方法的参数二可以指定Lambda表达式或函数,包括两个参数,返回值的规则如下:

  • 返回值小于0,参数一排在参数二之前。
  • 返回值大于0,参数一排在参数二之后。
  • 返回值为0,两个元素相等。

此外,Reverse()方法可以将数组元素反向排列,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 2,1,3,5,7,8,9 };
            Array.Reverse(arr);
            Console.WriteLine(string.Join(",", arr));
        }
    }
}

执行代码会显示“9,8,7,5,3,1,2”。

Array类——改变元素数量

改变元素数量时可以使用Array.Resize()方法,其中,参数一指定数组对象,定义为按引用传递,设置时需要使用ref关键字;参数二指定新的尺寸,当尺寸大于原有元素数量时,新的元素添加到原有元素的后面,新元素的值为元素类型的默认值,如果尺寸小于原有元素数量,则删除多出的元素。下面的代码演示了Resize()方法的应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1,2,3,4,5 };
            Array.Resize(ref arr,3);
            Console.WriteLine(string.Join(",", arr));  // 1,2,3
            Array.Resize(ref arr, 6);
            Console.WriteLine(string.Join(",", arr));  // 1,2,3,0,0,0
        }
    }
}

Array类——清除元素数据

清除元素数据可以使用Array.Clear()方法,其中,参数一指定数组对象,参数二指定清除开始的索引位置,参数三指定清除的元素数量。清除元素的数据会变成元素类型的默认值,下面的代码演示了Clear()方法的应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1,2,3,4,5 };
            Array.Clear(arr,1,3);
            Console.WriteLine(string.Join(",", arr));  // 1,0,0,0,5
        }
    }
}

多维数组

定义多维数组时可以在中括号中使用逗号指定维度,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] arr = { { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12} };
            Console.WriteLine(arr[1,0]);  // 5
        }
    }
}

代码中,int[,]定义二维数组,元素中,第一维包含三个元素,其中每个元素又包含第二维的四元素。arr[1,0]会读取第一维中第二个元素中的第一个元素5。

定义一个包含默认数据的多维数组时,可以使用数值指定每个维度的元素数量,如下面的代码。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] arr = new int[3, 4];
            Console.WriteLine(arr[1,0]);  // 0
        }
    }
}

读取和设置数组的元素时,GetValue()方法读取元素数据,参数依次指定各维度的索引值。SetValue()方法,设置元素数据,参数一为元素数据,参数二开始依次指定各维度的索引值。下面的代码演示了相关应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] arr = { { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12} };
            arr.SetValue(999, 1, 0);
            Console.WriteLine(arr[1,0]);  // 999
            Console.WriteLine(arr.GetValue(1, 0));  // 999
        }
    }
}

GetLength()和GetLongLength()方法都用于返回指定维度的元素数量,不同是的返回值的类型,分别是int和long类型。下面的代码演示了相关应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] arr = { { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12} };
            Console.WriteLine(arr.GetLength(0));  // 3
            Console.WriteLine(arr.GetLongLength(1));  // 4
        }
    }
}

此外,如果集合的元素需要大量的动态操作,如添加、删除、修改等,可以使用List泛型类,后续文章会详细介绍。