介绍C#中数组的用法。
以整型数组为例。
参考了下面链接内容,在此表示对作者的感谢。
https://blog.csdn.net/jia18337935154/article/details/87880529
https://www.runoob.com/csharp/csharp-array-class.html
一、整型数组的定义和遍历
题目要求:输入一个整数N,生成一个大小为N的数组 nums,输入N个整数,从前到后存入 nums,遍历nums,把 nums 中数据从前到后输出到屏幕上,中间用一个空格隔开。
1、输入一行字符串
string s=Console.ReadLine();//
2、把字符串转换为整数
int N;
N = Convert.ToInt32(s);
3、定义一个大小为N的数组
int[] nums = new int[N];
4、从键盘输入N个整数并存入数组nums
for(int i=0;i<N;i++)
{
s = Console.ReadLine();
nums[i] = Convert.ToInt32(s);
}
5、遍历数组nums并输出
public static void print(int[] nums)
{
foreach(int x in nums)
{
Console.Write("{0} ", x);
}
Console.WriteLine("\n");
}
注意:
nums是一个变量,里面存储N个数据的首地址,这N个数据在内存中是连续的,如下图所示:
二、数组的逆转(倒置)
Array.Reverse(nums);
print(nums);
注意:Array是一个类,是所有数组的父类,其中实现了对数组的通用操作。它是超越类型的,无论什么类型都可以。
三、数组的排序(从小到大排列)
Array.Sort(nums);
print(nums);
四、数组的排序(从大到小排列)
Array.Sort(nums, (a, b) =>-a.CompareTo(b));
print(nums);
注意:sort的第二个参数是lamda函数形式:(a, b) =>-a.CompareTo(b)
如果去掉 a.CompareTo(b) 前面的负号,就是默认的按照升序排列。
加上负号,就是降序排列。
五、减少输入的小技巧
从上面例子我们可以看出,每次运行程序,我们都需要输入数据,比较浪费时间。
下面,我们引入随机类Random,随机生成数据,这样就可以不必每次输入数据了。可以节省学习的时间。
1、定义随机对象
Random r = new Random();
2、得到随机数
int x=r.Next();
得到的是[0,32767]之间的整数。
可以用求余数的方法限定随机数范围。
int x=m+r.Next()%n;
就得到[m,m+n)之间的数。
3、一个比较完整的程序
public static void print(int[] nums)
{
foreach(int x in nums)
{
Console.Write("{0} ", x);
}
Console.WriteLine("\n");
}
public static void GetRandom(int[] nums)
{
Random r = new Random();
for (int i = 0; i < nums.Length; i++)
{
nums[i] = r.Next() % 10;
}
}
static void Main(string[] args)
{
int N=5;
int[] nums = new int[N];
GetRandom(nums);
Console.WriteLine("新生成的数据:");
print(nums);
Console.WriteLine("逆转后:");
Array.Reverse(nums);
print(nums);
Console.WriteLine("按升序排列:");
Array.Sort(nums);
print(nums);
Console.WriteLine("按降序排列:");
Array.Sort(nums, (a, b) =>-a.CompareTo(b));
print(nums);
}
一次运行结果:
六、数组名之间赋值
int[] nums = { 1, 3, 2, 6, 4, 5 };
int[] A;
A = nums;
print(nums);
print(A);
输入结果一模一样。这是因为:
1、在C#中,数组名A、nums是变量;要存储数组第一个元素的地址。
2、A=nums;相当于A和nums中存储的那个地址数据一样。
七、数组之间真正拷贝数据
int[] nums = { 1, 3, 2, 6, 4, 5 };
int[] A;
A=(int[])nums.Clone();//复制,克隆
print(nums);
print(A);
A[0] = 999;
print(nums);
print(A);
八、限制
int[] nums;
int N = 6;
nums = new int[N];
这样定义的数组nums,一旦new之后,大小就是N。
如果在程序运行过程中,发现N不足,无法容纳到来的数据。
就应该再开辟一个新数组B,大小足够大,把nums中数据拷贝进去,然后再把新数据插入B中。
最后让nums也指向新的空间,即nums=B。
这就是《数据结构》上顺序表的思想。