泛型集合和泛型委托

一: 泛型委托:1. 泛型委托就是把泛型和委托结合起来。
  2. 定义:delegate void MyDg<T>();
               3. 系统内置4个重要的委托(我们最常用的):
a. Action  无返回值,T只能作为参数。例子:泛型集合List中的Foreach 有16个重载
b. Predicate  返回bool型。例子:泛型集合中的Find,FindAll 有16个重载
c. Comparison  返回int型。 例子:用于自定义排序
d. Func  自定义返回值。是使用最多的。 有16个重载


二:泛型集合:
1. 泛型集合(强类型集合),存储相同类型的一个数组,List(集合),Dictionary(字典),最常用的是List。
2. 定义:List<int> lstInt = new List<int>(); Dictionary<string,string> dic = new Dictionary<string,string>();
3. 实质:List中其实就是一个数组,只不过这个数组是private。这个数组都是通过方法来添加删除其中的某个元素。
该数组的默认初始化长度是4,如果Add或者AddRange时,长度超过了该数字,数组就会自动扩容,以该数的平方扩容,也就是4,8,16,32.....(其实是创建一个新的大的数组,然后把原来数组的值复制进去)
所以如果我们知道该集合的大概长度,最好是初始化时就赋值:List<int> lstInt = new List<int>(1000);
在List中有大量的方法来操作这个数组,其中很多方法都使用了委托(系统内置的泛型委托)。
4. 常用的方法:
Add:添加一个元素
AddRange:一次性添加多个元素
Insert:把元素添加到指定的下标中
InsertRange:添加多个元素到指定的下标中
Remove:删除一个元素  lstInt.Remove(10); // 删除集合中为10的元素,如果集合中有多个,只删除第一个
RemoveAt:删除某个指定的元素(下标)  lstInt.RemoveAt(2);
RemoveAll: 删除符合条件的元素(泛型委托,Predicate) 写法:lstInt.RemoveAll(new Predicate<int>(delegate(int num){ return num > 10;}));
lstInt.RemoveAll(delegate(int num){ return num > 10;}); // 因为是一个方法,可以直接点
lstInt.RemoveAll(num => num > 10); // 委托都可以简化成为Lambda表达式 => 前面是参数,
后面是方法体。如果参数有多个(泛型委托的形参也得有多个):
lstInt.RemoveAll((num, num1) => { return (num > 10 || num1 > 50); });
RemoveRange:删除一定范围的元素   lstInt.RemoveRange(0, 1);
Count:属性,集合中实际包含的元素个数。
Count:方法,集合符合条件的元素个数  lstInt.Count(s => s > 10);
Capacity:属性,集合中能容纳的元素个数
First,FirstOrDefault:集合中第一个元素,一般使用FirstOrDefault,这样当集合中找不到元素时,不会报错
Last,LastOrDefault:集合中最后一个元素,一般使用LastOrDefault
IndexOf:集合中第一个符合条件的元素的下标
LastIndexof:集合中最后一个符合条件的元素的下标
Contains:指定元素是否包含值集合中
Find,FindAll:找出一个或多个符合条件的元素
Reverse:把数组反转,就是把数组倒过来。
Select:把这个集合中的元素弄到另外一个集合中去。一般来说,主要只要对象中的几个属性,比如,某个对象有10个属性,我只要其中的5个。还有就是Linq中走火的select把查出来的元素映射到一个新的对象中。
Sort:排序
Sum:求总和
OrderBy,OrderByDescending:按照指定的某个或多个属性排序,小->大,大->小
GroupBy:按照指定的属性分组
Skip,Take:主要用于分页, lstInt.Skip(2).Take(5);  // 跳过前面的2个元素,取后面的5个。
一般使用回合OrderBy或者OrderByDescending一起使用:lstInt.OrderBy(s => s).Skip(5).Take(5);// 需要把Skip中的参数改成动态的
Exit:元素中是否包含符合条件的元素。一般和Find,FindAll等参数是Predicate委托的函数一起使用。lstInt = lstInt.FindAll(s => lstInt.Exists(u => s > 10));
5. Dictionary
一个键对应一个值:Dictionary<string,int> dic = new Dictionary<string,int>();

一个键对应多个值:Dictionary<string,List<int>> dic = new Dictionary<string,List<int>>(); // 类似GroupBy函数的返回值

值得注意的是,Dictionary的键是不能重复的,如果非要重复,那么可以和List一起使用。List<Dictionary<string,string>> ,这样就可以让键值重复了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值