一、简单介绍
Array是C#中所有数组类型的抽象基类,用于存储固定长度的同类型元素集合。
在Visual Studio中,数组是最基础的数据结构之一,适用于需要快速访问元素的场景。
二、数组声明与初始化模板
数组的声明需指定类型和维度,初始化时需指定长度或直接赋值元素。
| 数组类型 | 声明模板 | 说明 |
| 一维数组 | 类型[] 数组名 = new 类型[长度] | 固定长度的线性集合 |
| 多维数组 | 类型[,] 数组名 = new 类型[行, 列] | 矩形多维数组(如二维表) |
| 交错数组 | 类型[][] 数组名 = new 类型[行数][] | 数组的数组(每行长度可变) |
| 隐式类型数组 | var 数组名 = new[] { 元素1, 元素2 } | 由元素类型推断数组类型 |
三、代码示例(Visual Studio控制台应用)
以下示例展示一维数组、多维数组的创建与使用:
// 1. 一维数组:存储5个整数
int[] numbers = new int[5] { 10, 20, 30, 40, 50 };
Console.WriteLine("一维数组元素:");
foreach (int num in numbers)
{
Console.Write(num + " ");// 输出:10 20 30 40 50
}
// 2. 二维数组:3行2列的矩阵
int[,] matrix = new int[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Console.WriteLine("\n\n二维数组元素:");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
Console.Write(matrix[i, j] + " ");// 输出:1 2 / 3 4 / 5 6
}
Console.WriteLine();
}
// 3. 交错数组:2行,每行长度可变
int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[] { 1, 2, 3 };// 第一行3个元素
jaggedArray[1] = new int[] { 4, 5 };// 第二行2个元素
Console.WriteLine("\n交错数组元素:");
foreach (int[] row in jaggedArray)
{
foreach (int num in row)
{
Console.Write(num + " ");// 输出:1 2 3 / 4 5
}
Console.WriteLine();
}
四、Array类常用静态方法
1. Array.FindIndex()
//根据参数2的条件返回第一个满足条件的元素的索引值
// FindIndex()的功能已经实现了遍历的功能,并且把元素传递到参数2的函数中
说明:
FindIndex<T>(T[], Int32, Int32, Predicate<T>):在数组的指定范围内返回第一个符合条件的元素的索引。
FindIndex<T>(T[], Int32, Predicate<T>):在指定索引后返回第一个符合条件的元素索引。
FindIndex<T>(T[], Predicate<T>):返回第一个符合条件的元素的索引。
示例:
int[] ages = { 1, 2, 3, 4, 5, 6, 7, 8,20,36,29 };
bool FindBig18(int v)
{
//v就是每一个元素 ages[i]
return v > 18;//如果v大于18 返回true ,如果v<=18 返回false
}
bool FindName(string v)
{
return v =="张三";
}
Console.WriteLine(Array.FindIndex(ages, FindBig18) );//8
Console.WriteLine(Array.FindIndex(new string[] {"张三","历史","王五","马六" },FindName));//0
2. Array.FindAll()
// 找到满足条件的所有元素返回是一个数组
说明:
FindAll<T>(T[], Predicate<T>):返回符合条件的所有元素。
示例:
bool FindEven(int v)
{
return v % 2 == 0;
}
int[] arr= Array.FindAll(ages,FindEven);
3. Array.Foreach()
// 循环遍历
说明:
对数组的每个元素执行指定的操作。
示例:
Array.ForEach(arr, v => Console.WriteLine(v+"--------"));//遍历出偶数
4. Array.Find()
//找到满足条件的元素
说明:
Find<T>(T[], Predicate<T>):搜索符合条件的第一个元素并返回。
示例:
bool FindStart(string v)
{
return v.StartsWith("ssr");
}
Console.WriteLine(Array.Find(new string[] { "ss", "ssr", "r", "a", "b" }, FindStart));//ssr
5. Array.FindLast()
//从后往前找,找到第一个满足条件的元素,返回其索引值
说明:
FindLast<T>(T[], Predicate<T>):返回符合条件的最后一个元素。
示例:
bool FindLast1(string v)
{
return v.StartsWith("ab");
}
Console.WriteLine(Array.FindLast(new string[] { "ss", "ssr", "r","ab" ,"abc", "b" }, FindLast1));//"abc"
6. Array.TrueForAll()
//数组内的元素是否都满足条件,如果都满足则为true,否则false
说明:定数组中是否所有元素都符合条件。
示例:
bool aa(int v)
{
return v < 30;
}
Console.WriteLine(Array.TrueForAll(ages, aa));//false
7. Array.Exists()
//数组内是否存在满足条件的元素,存在一个条件即可,只要存在则为true,否则false
说明:
确定数组是否包含符合条件的元素。
示例:
Console.WriteLine(Array.Exists(ages, aa));// true
8. Any()
//数组中满足条件的元素存在一个即可等同于 Array.Exists()
示例:
string[] names = new string[] { "ss", "ssr", "r", "ab", "abc", "b" };
Console.WriteLine(names.Any(FindLast1));//true
9. All()
//数组中的所有元素都满足条件,整体结果为true 等同于 Array.TrueForAll()
示例:
Console.WriteLine(names.All(FindLast1));//false
10. Contains()
//数组中是否包含该元素
示例:
Console.WriteLine(names.Contains("abcd")+"------");//false------
11. Concat()
//串联两个数组
示例:
string[] ss = { "2", "3" };
foreach (string item in names.Concat(ss))
{
Console.WriteLine(item+"++++++++");//串联并遍历两个数组中的元素 并附加上"++++++++"
}
五、注意事项
- 长度固定:数组一旦创建,长度不可动态修改。若需动态增减元素,建议使用
List<T>。 - 值类型与引用类型:
- 值类型数组(如
int[]):元素直接存储值,修改元素不影响原数据。 - 引用类型数组(如
string[]):元素存储对象引用,修改元素会改变原对象。
- 值类型数组(如
- 多维数组 vs 交错数组:
- 多维数组(
int[,]):所有行长度相同,内存连续。 - 交错数组(
int[][]):每行长度可不同,内存不连续,更灵活。
- 多维数组(
- 越界访问:访问数组时若索引超出
[0, Length-1]范围,会抛出IndexOutOfRangeException,需注意边界检查。
六、综合示例
//1. 查询类中的所有男性
//2. 查询类中第一个女性
//3. 判断数组中是否全为成年人
//4. 查询类中的第一个未成年男性
class People
{
public enum Sex
{
man = 1,
woman = 2,
}
public string Name { get; set; }
public Sex XingBie { get; set; }
public int Age { get; set; }
}
internal class Program
{
static void Main(string[] args)
{
People[] p = new People[]
{
new People(){Name="张三",Age = 25,XingBie = People.Sex.man},
new People(){Name="李四",Age = 17,XingBie = People.Sex.man},
new People(){Name="王五",Age = 30,XingBie = People.Sex.woman},
new People(){Name="赵六",Age = 25,XingBie = People.Sex.woman},
new People(){Name="刘十",Age = 22,XingBie = People.Sex.man},
};
//1. 查询类中的所有男性FindAll()
bool FindAll(People a)
{
return a.XingBie == People.Sex.man;
}
People[] p1 = Array.FindAll(p, FindAll);
People[] pp = Array.FindAll(p, c => c.XingBie == People.Sex.man);
foreach (People a in p1)
{
Console.WriteLine(a.Name + " " + a.Age + " " + a.XingBie);
}
foreach (People a in pp)
{
Console.WriteLine(a.Name + " " + a.Age + " " + a.XingBie+"------------");
}
//2. 查询类中第一个女性 Array.FindIndex()
bool FindIndex1(People a)
{
return a.XingBie == People.Sex.woman;
}
Console.WriteLine(p[Array.FindIndex(p, FindIndex1)].Name+" "+ p[Array.FindIndex(p, FindIndex1)].XingBie);
bool Find(People a)
{
return a.XingBie == People.Sex.woman;
}
People p2 = Array.Find(p, Find);
Console.WriteLine(p2.Name + " " + p2.XingBie);
//3. 判断数组中是否全为成年人 Array.TrueForAll()
bool TrueForAll1(People a)
{
if (a.Age > 18)
{
return true;
}
return false;
}
bool TrueForAll2(People a)
{
return a.Age >= 18;
}
Console.WriteLine(Array.TrueForAll(p, TrueForAll1));
Console.WriteLine(Array.TrueForAll(p, TrueForAll2));
//4. 查询类中的第一个未成年男性 Array.FindIndex()
bool FindIndex2(People a)
{
if (a.XingBie == People.Sex.man && a.Age >= 18)
{
return true;
}
return false;
}
Console.WriteLine(p[Array.FindIndex(p, FindIndex2)].Name+" " + p[Array.FindIndex(p, FindIndex2)].Age);
}