C#代码中,可以将一组相同类型的数据定义在数组中,然后进行统一操作,以提高处理效率。本文将讨论C#代码中如何使用数组,以及如何使用Array类处理数组。
C#和.NET Framework中的各种类型,以及自定义类型都可以作为数组元素的基本类型。数组类型需要使用元素类型一对方括号定义,如int[]表示元素为int类型的数组。如果在创建数组时指定元素,可以使用一对花括号定义,如下面的代码。
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个元素的数组,并通过索引设置和读取元素数据。
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语句循环访问并处理数组元素,如下面的代码。
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); } } }
引用System.Linq命名空间后,还可以使用一些数组的扩展方法,如下面的代码。
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类中定义了数组的一系列操作方法,下面分别介绍。
查找元素时可以使用如下方法:
下面的代码演示了这两个方法的应用。
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()方法可以返回满足条件的元素组成的新数组,如下面的代码。
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。
查找数组元素的方法还包括:
在这些方法中,参数二除了使用Lambda表达式,还可以通过方法定义查询条件,如下面的代码。
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类的Sort()方法可以对数组元素进行排序,默认使用升序排列,如下面的代码。
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()方法的第二个参数可以定排列方法,如下面的代码可以实现降序排列。
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表达式或函数,包括两个参数,返回值的规则如下:
此外,Reverse()方法可以将数组元素反向排列,如下面的代码。
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.Resize()方法,其中,参数一指定数组对象,定义为按引用传递,设置时需要使用ref关键字;参数二指定新的尺寸,当尺寸大于原有元素数量时,新的元素添加到原有元素的后面,新元素的值为元素类型的默认值,如果尺寸小于原有元素数量,则删除多出的元素。下面的代码演示了Resize()方法的应用。
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.Clear()方法,其中,参数一指定数组对象,参数二指定清除开始的索引位置,参数三指定清除的元素数量。清除元素的数据会变成元素类型的默认值,下面的代码演示了Clear()方法的应用。
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 } } }
定义多维数组时可以在中括号中使用逗号指定维度,如下面的代码。
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。
定义一个包含默认数据的多维数组时,可以使用数值指定每个维度的元素数量,如下面的代码。
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()方法,设置元素数据,参数一为元素数据,参数二开始依次指定各维度的索引值。下面的代码演示了相关应用。
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类型。下面的代码演示了相关应用。
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泛型类,后续文章会详细介绍。