C#学习(2)–数组
一维数组
一维数组的定义
//一维数组定义
int[] a;
double[] b;
string[] c;
一维数组初始化
动态初始化
//默认全部为0
int[] a = new int[10];
//赋初值的初始化
int[] a = new int[10]{1,2,3,4,5,6,7,8,9,10};
int[] a = new int[]{1,2,3,4,5,6,7,8,9,10}
//在这种情况下,不允许“数组长度”为变量,例如:
int n = 5; //定义变量n
int[] myarr = new int[n] {1,2,3,4,5}; //错误
//赋值元素必须和数组长度对应
int[] mya = new int[2] {1,2}; //正确
int[] mya = new int[2] {1,2,3}; //错误
int[] mya = new int[2] {1}; //错误
静态初始化
//静态初始化数组时,必须与数组定义结合在一起,否则会出错。
int[] myarr={1,2,3,4,5};
//在这种情况下,不能将数组定义和静态初始化分开,例如,以下是错误的。
int[] myarr;
myarr={1,2,3,4,5}; //错误的数组的静态初始
访问
与C++同通过下标访问
还可以通过foreach实现遍历
int[] mya = {1,2,3,4,5,6};
foreach (int i in mya)
System.Console.Write("{0} ",i);
Console.WriteLine();
数组越界
与C中定义同
二维数组
定义
例:
int[,] x;
double[,] y;
string[,] z;
//可推广至多维
int[,,] p;
动态初始化
//未赋初值,默认为0
int[,] x = new int[2,3];
//给定初始值
int[,] x = new int[2,3]{{1,2,3},{4,5,6}};
int[,] x = new int[,]{{1,2,3},{4,5,6}};
静态初始化
int[,] myarr={{1,2,3},{4,5,6}};
访问
下标访问
int[,] d = new int[2,3]{{1,2,3},{4,5,6}};
int i,j;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
Console.Write("{0} ",d[i,j]);
Console.WriteLine();
使用foreach
int[,] myb = new int[3, 2] { {1, 2}, {3,4}, {5,6}};
foreach (int i in myb)
Console.Write("{0} ", i);
Console.WriteLine();
交错数组
元素为数组的数组,元素的维度和大小可以不同。
定义
int[][] arrj = new int[3][];
arrj[0] = new int[5];
arrj[1] = new int[4];
arrj[2] = new int[2];
访问
//交错数组元素的访问方式与多维数组类似,通常使用Length方法返回包含在交错数组中的数组的数目。
int[][] myarr = new int[3][];
myarr[0] = new int[] {1,2,3,4,5,6};
myarr[1] = new int[] {7,8,9,10};
myarr[2] = new int[] {11,12};
for (int i = 0; i < myarr.Length; i++)
{ Console.Write("myarr({0}): ", i);
for (int j = 0; j < myarr[i].Length; j++)
Console.Write("{0} ", myarr[i][j]);
Console.WriteLine();
}
//类似于多维数组的访问方式
Array类和Arrylist
Array类
属性 | 说明 |
---|---|
Length | 获得一个32位整数,该整数表示Array的所有维数中元素的总数。 |
LongLength | 获得一个64位整数,该整数表示Array的所有维数中元素的总数。 |
Rank | 获取Array的秩(维数)。 |
方法 | 说明 |
---|---|
BinarySearch | 静态方法。使用二进制搜索算法在一维的排序Array中搜索值。 |
Copy | 静态方法。将一个Array的一部分元素复制到另一个Array中,并根据需要执行类型强制转换和装箱。 |
CopyTo | 非静态方法。将当前一维Array的所有元素复制到指定的一维Array中。 |
Find | 静态方法。搜索与指定谓词定义的条件匹配的元素,然后返回整个Array中的第一个匹配项。 |
ForEach | 静态方法。对指定数组的每个元素执行指定操作。 |
GetLength | 非静态方法。获取一个32位整数,该整数表示Array的指定维中的元素数。 |
GetLongLength | 非静态方法。获取一个64位整数,该整数表示Array的指定维中的元素数。 |
GetLowerBound | 非静态方法。获取Array中指定维度的下限。 |
GetUpperBound | 非静态方法。获取Array的指定维度的上限。 |
GetValue | 非静态方法。获取当前Array中指定元素的值。 |
IndexOf | 静态方法。返回一维Array或部分Array中某个值第一个匹配项的索引。 |
Resize | 静态方法。将数组的大小更改为指定的新大小。 |
Reverse | 静态方法。反转一维Array或部分Array中元素的顺序。 |
SetValue | 非静态方法。将当前Array中的指定元素设置为指定值。 |
Sort | 静态方法。对一维Array对象中的元素进行排序。 |
using System;
namespace proj4_3
{ class Program
{ static void Main(string[] args)
{ int i,k;
int[] myarr = new int[10]; //定义一个一维数组
Random randobj = new Random(); //定义一个随机对象
for (i = myarr.GetLowerBound(0); i <= myarr.GetUpperBound(0); i++)
{ k=randobj.Next() % 20; //返回一个0~19的正整数
myarr.SetValue(k, i); //给数组元素赋值
}
Console.Write("随机数序:");
for (i = myarr.GetLowerBound(0); i <=myarr.GetUpperBound(0); i++)
Console.Write("{0} ", myarr.GetValue(i));
Console.WriteLine();
Array.Sort(myarr); //数组排序
Console.Write("排序数序:");
for (i = myarr.GetLowerBound(0); i <=myarr.GetUpperBound(0); i++)
Console.Write("{0} ", myarr.GetValue(i));
Console.WriteLine();
}
}
}
Arraylist类
ArrayList类(在命名空间System.Collections中),用于建立不定长度的数组,由于该类数组的数据类型为Object,其长度不固定,可以将其对象看成是一个集合。
ArrayList myarr = new ArrayList();
属性 | 说明 |
---|---|
Capacity | 获取或设置ArrayList可包含的元素数。 |
Count | 获取ArrayList中实际包含的元素数。 |
Item | 获取或设置指定索引处的元素。 |
方法 | 说明 |
---|---|
Add | 将对象添加到ArrayList的结尾处。 |
AddRange | 将一个ICollection对象的元素添加到ArrayList的末尾。 |
BinarySearch | 使用二分检索算法在已排序的ArrayList或它的一部分中查找特定元素。 |
Clear | 从ArrayList中移除所有元素。 |
Clone | 创建ArrayList的浅表副本。 |
Contains | 确定某元素是否在ArrayList中。 |
CopyTo | 将ArrayList或它的一部分复制到一维数组中。 |
GetRange | 返回ArrayList,它表示源ArrayList中元素的子集。 |
IndexOf | 返回ArrayList或它的一部分中某个值的第一个匹配项的从零开始的索引。 |
Insert | 将元素插入ArrayList的指定索引处。 |
InsertRange | 将集合中的某个元素插入ArrayList的指定索引处。 |
LastIndexOf | 返回ArrayList或它的一部分中某个值的最后一个匹配项的从零开始的索引。 |
Remove | 从ArrayList中移除特定对象的第一个匹配项。 |
RemoveAt | 移除ArrayList的指定索引处的元素。 |
RemoveRange | 从ArrayList中移除一定范围的元素。 |
Reverse | 将ArrayList或它的一部分中元素的顺序反转。 |
SetRange | 将集合中的元素复制到ArrayList中一定范围的元素上。 |
Sort | 对ArrayList或它的一部分中的元素进行排序。 |
ToArray | 将ArrayList的元素复制到新数组中。 |
ToString | 返回表示当前Object的String。 |
TrimToSize | 将容量设置为ArrayList中元素的实际数目。 |
例子:
using System;
using System.Collections; //新增
namespace proj4_4
{ class Program
{ static void Main(string[] args)
{ ArrayList myarr = new ArrayList();
myarr.Add("Smith");
myarr.Add("Mary");
myarr.Add("Dava");
myarr.Add("John");
Console.Write("排序前序列:");
foreach(String sname in myarr)
Console.Write(sname + " ");
Console.WriteLine();
myarr.Sort();
Console.Write(“排序后序列:");
foreach(String sname in myarr)
Console.Write(sname + " ");
Console.WriteLine();
}
}
}
LIST类
List类是ArrayList类的泛型等效类,该类使用大小可按需动态增加的数组实现IList泛型接口。
List<string> myset = new List<string>();
属性 | 说明 |
---|---|
Capacity | 获取或设置该内部数据结构在不调整大小的情况下能够保存的元素总数。 |
Count | 获取List中实际包含的元素数。 |
Item | 获取或设置指定索引处的元素。 |
方法 | 说明 |
---|---|
Add | 将对象添加到List的结尾处。 |
AddRange | 将指定集合的元素添加到List的末尾。 |
BinarySearch | 使用对分检索算法在已排序的List或它的一部分中查找特定 |
元素。 | |
Clear | 从List中移除所有元素。 |
Contains | 确定某元素是否在List中。 |
CopyTo | 将List或它的一部分复制到一个数组中。 |
Exists | 确定List是否包含与指定谓词所定义的条件相匹配的元素。 |
Find | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 |
List中的第一个匹配元素。 | |
FindAll | 检索与指定谓词所定义的条件相匹配的所有元素。 |
FindIndex | 搜索与指定谓词所定义的条件相匹配的元素,返回List或它 |
的一部分中第一个匹配项的从零开始的索引。 | |
FindLast | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 |
List中的最后一个匹配元素。 | |
FindLastIndex | 搜索与指定谓词所定义的条件相匹配的元素,返回List或它的一部分中最后一个匹配项的从零开始的索引。 |
ForEach | 对List的每个元素执行指定操作。 |
IndexOf | 返回List或它的一部分中某个值的第一个匹配项的从零开始的索引。 |
Insert | 将元素插入List的指定索引处。 |
InsertRange | 将集合中的某个元素插入List的指定索引处。 |
LastIndexOf | 返回List或它的一部分中某个值的最后一个匹配项的从零开始的索引。 |
Remove | 从List中移除特定对象的第一个匹配项。 |
RemoveAll | 移除与指定的谓词所定义的条件相匹配的所有元素。 |
RemoveAt | 移除List的指定索引处的元素。 |
RemoveRange | 从List中移除一定范围的元素。 |
Reverse | 将List或它的一部分中元素的顺序反转。 |
Sort | 对List或它的一部分中的元素进行排序。 |
ToArray | 将List的元素复制到新数组中。 |
TrimExcess | 将容量设置为List中的实际元素数目(如果该数目小于某个阈值)。 |
例子:
using System;
namespace proj4_5
{ struct Stud //定义结构类型
{ public int sno; //学号
public string sname; //姓名
};
class Program
{ static void Main(string[] args)
{ int i;
List<Stud> myset = new List<Stud>();
Stud s1 = new Stud();
s1.sno = 101;s1.sname = "李明";
myset.Add(s1);
stud s2 = new Stud();
s2.sno = 103; s2.sname = "王华";
myset.Add(s2);
Stud s3 = new Stud();
s3.sno = 108; s3.sname = "张英";
myset.Add(s3);
Stud s4 = new Stud();
s4.sno = 105; s4.sname = "张伟";
myset.Add(s4);
Console.WriteLine("元素序列:");
Console.WriteLine(" 下标 学号 姓名");
i = 0;
foreach (Stud st in myset)
{ Console.WriteLine(" {0} {1} {2}", i,st.sno, st.sname);
i++;
}
Console.WriteLine("容量: {0}", myset.Capacity);
Console.WriteLine("元素个数: {0}", myset.Count);
Console.WriteLine("在索引2处插入一个元素");
Stud s5 = new Stud();
s4.sno = 106; s4.sname = "陈兵";
myset.Insert(2, s5);
Console.WriteLine("元素序列:");
Console.WriteLine(" 下标 学号 姓名");
i = 0;
foreach (Stud st in myset)
{ Console.WriteLine(" {0} {1} {2}", i, st.sno, st.sname);
i++;
}
}
}
}