Lambdan表达式
lambda表达式: 可以让我们定义一个变量接收的一个函数,主要是作为另外一个函数的参数进行使用,具体体现变量和函数体之间使用 =>,所以其他的编程语言称之为箭头函数,但是严谨来说C#没有箭头函数
如果一个函数仅在当前作用域进行使用,可以把函数定义在当前作用域就行
int Sum(int a,int b) { return a + b; } Console.WriteLine(Sum(10,20));定义一个lambda表达式
方法组成:参数列表、返回值、方法名、方法体
它有三种类型:
第一种 使用Func关键字接收有返回值的lambda表达式
Func<> 方法类型、函数类型
第一个类型 是参数1的类型
第二个类型 是参数2的类型
第三个类型 是返回值的类型
结构组成:
f1 变量名
(a,b)参数类别 不用写类型,多个参数的时候加个 ()
=> 表达式
{ }
方法体
有返回值的添加return 关键字
Func<int, int, int> f1 = (a, b) => { return a + b; }; Console.WriteLine(f1(10,20));//可以通过变量名调用函数第二种 使用Action关键字接收无返回值的lambda表达式
定义一个字符串参数 无返回值的lambda表达式
如果一个参数的时候可以把()不写
如果函数体只有一句可以把{ }
省略掉
Action<string> f2 = (a) => Console.WriteLine(a); f2("hello word");第三种 使用Predicate<>关键字接收返回值为bool类型的lambda表达式
Predicate<int> f3 =a => a%2 == 0; Console.WriteLine(f3(3));//false Func<int ,bool >f4 =a => a%3==0; Console.WriteLine(f4(9));//true/*Func<参数类型 参数类型 返回值类型> f1 =(a,b)=>{return a+b} *可以接收有返回值的lambda表达式 参数个数没有限制、返回值的类型也是没有限制 * *Action<string> f2 = a =>Console.WriteLine(a) *只能接收无返回值的lambda表达式 * *Predicate<int> f3 = a =>a%2==0; *只能接收返回值为bool类型的lambda表达式 * */lambda具体的使用场景: 最为另外一个函数参数进行使用 数组的查询方法当中使用
int[] ints = { 1, 2, 3, 4, 5, 6, 7, 8, 9, }; Console.WriteLine(Array.Find(ints,a =>a%2==0)); int[] ss = Array.FindAll(ints, v => v % 3 == 0);//找到所有的数组 //第一种遍历数组 for (int i = 0; i < ss.Length; i++) { Console.WriteLine(ss[i]+"----"); } //第二种遍历数组 foreach (var item in ss) { Console.WriteLine(item+"++++++++"); } //第三种遍历数组 Array.ForEach(ss, v => Console.WriteLine(v+"???????")); //where 找到所有满足条件的元素 foreach (var item in ints.Where(v => { return v % 3 == 0; })) { Console.WriteLine(item); }可空类型数据
空类型是null,引用类型的变量都可以赋值成null
string s = null; int[] ints = null; object o = null;基本数据类型不能赋值为null的
int a = null;// 报错如果想让基本数据类型能够赋值为null 可以使用?
int? a = null; // a以后可以等于null 在原先的范围内加一个null赋值范围 a = 100;// a可以再赋值100 // int sum = a + 100; 报错 a是可空类型,但是sum不是可空类型即想使用可空类型 又想使用基本类型进行运算,可以把可空类型再加一个问号 使用双??
int? b = null; // b可空类型 b = 300; int aa = b ?? 100; // b?? 如果b是null aa的值100, 如果b不是null aa的值300 Console.WriteLine(aa); //300 int? c = null; int d = c ?? 100; Console.WriteLine(d);//100 c = 999; int sum = (c ?? 100) + 200; Console.WriteLine(sum);// 1199动态数组ArrayList
Arraylist:
动态数组一个不固定长度的数组集合,并且可以存储不用类型的元素,例如一个arrayList对象可以存储整形、字符串、对象、数组等
但是int[]这种数组一旦创建好之后 不能后续添加元素 也就是长度他是固定的 并且一个数组对只能存储一种类型的元素
弊端
ArrayList 弊端: 取出元素是一个object类型 必须对其再进行类型转换
使用动态数组ArrayList
第一步先创建一个arrayList对象
int[] ints = new int[] { 1, 2, 3 }; People p1 = new People() { Name="张三" }; ArrayList arr = new ArrayList() { 1, 2, 3,"李四",true,ints,p1 };//这句话是初始化添加的元素第二步取出元素 通过索引值取元素 arr[i]
//int aa =arr[0];//数组取出的元素是object类型 如果想转成其他类型 必须强制转换一下 Console.WriteLine(Convert.ToInt32(arr[1]));第三步添加元素
arr.Add(1); arr.Add("王五");//添加一个元素 arr.AddRange(ints);//也可以添加一个数组第四步删除元素
arr.Remove("王五");//删除他这个指定的元素 arr.RemoveAt(0); //删除指定位置的元素 //arr.RemoveRange(0,3); //从指定参数1位置开始删除下面参数个数的元素第五步修改元素
arr[1] = 48;第六步数组排序
arr.Sort();//默认升序排序第七步indexOf() 元素的索引值
Console.WriteLine(arr.IndexOf(48));第八步count 获取数组的个数
Console.WriteLine(arr.Count);第九步Reverse() 把数组里面的元素进行倒序
arr.Reverse();第十步toArray() 把ArrayList转成Array(int[])
object[] i1 = arr.ToArray();ArrayList 类: arr 对象
查询可以查询一个arr[1],查询多个for遍历
最后算法遍历元素
如果数组元素类型不一样遍历的时候把类型改成object
foreach (object i in arr) { Console.WriteLine(i+"---------"); }List数组
ArrayList 动态数组 存储元素类型object类型 取出的时候转成对应的类型,类型不安全
List: 方法和ArrayList很像 区别在于list可以指定类型进行存储,存储同一种类型数据,取出时候不用强制转换,保证数据类型安全
创建一个List的集合对象
List<int> list = new List<int>();//创建一个集合对象1 添加元素
list.Add(1); list.Add(2); list.Add(3); list.AddRange(new int[] { 9, 10, 11 });//添加多个数2 删除
list.Remove(11);//删除指定元素 list.RemoveAt(list.Count - 1);//删除指定位置的元素 list.RemoveAll(v => v % 3 == 0);//删除满足条件对的所有的元素3 修改
list[0] = 20;4 插入数据
list.Insert(1, 10);//在索引值为1的地方插入8885 IndexOf() 获取元素的索引值
Console.WriteLine(list.IndexOf(888));6 遍历
foreach (int i in list) { Console.WriteLine(i+""); }