委托
委托基本上等于函数指针
函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相 比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法, 你无须担心delegate会指向无效地址或者越界地址。
简单的说就是一个更加安全功能更强大的函数指针
声明方式
[修饰符] delegate 返回类型 委托名(形参);
使用方式
委托名 委托实例名=函数名;
例子
delegate void test_delegate(string name);//声明委托
static void Main(string[] args)
{
test_delegate test_delegate_function = test;//实例化委托
test_delegate_function("123");//使用委托
}
//被委托的函数
public static void test(string name) {
Console.WriteLine("hello "+name);
}
Func<>和Action<>
Func<>和Action<>是一种不需要提前声明的委托,
Func<>有返回值,在<>中最后一个类型代表返回值的类型
Action<>没有返回值,在<>中全部是输入参数的类型
Func<>例子
static void Main(string[] args)
{
Func<int, int, int> myfunc = addnum;//创建Func委托
int result = myfunc(1,2);
}
//被委托的函数
public static int addnum(int a, int b)
{
return a + b;
}
Action<>例子
static void Main(string[] args)
{
Action<int, int> myaction = outputsum;//创建Action委托
myaction(1,2);//使用Action委托
}
//待委托函数
public static void outputsum(int a, int b)
{
Console.WriteLine(a+b);
}
匿名方法
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
例子
public delegate int mydele(int a,int b);//声明委托
static void Main(string[] args)
{
mydele nc = delegate (int aa, int bb){return aa + bb;};//直接将函数体委托
int cc = nc(1,2);//使用委托
}
lambda表示式
Lambda 表达式是一种可用于【创建委托】或【表达式目录树】的匿名函数
形如:(输入参数)=>{操作}
输入参数可以为任意个,一个输入参数的时候括号可省略
整个表达式是一个整体
表达式案例
(x, y) => x * y //多参数,隐式类型=>表达式
x => x * 5 //单参数,隐式类型=>表达式
x => { return x * 5; } //单参数,隐式类型=>语句块
(int x) => x * 5 //单参数,显式类型=>表达式
(int x) => { return x * 5; } //单参数,显式类型=>语句块
() => Console.WriteLine() //无参数
lambda委托案例
public delegate int mydele(int a,int b);//声明委托
static void Main(string[] args)
{
mydele myadd = (f1, f2) => { return f1 + f2; };//把lambda表达式传递给委托。
//其中(f1, f2) => { return f1 + f2; }就是lambda表达式。
int c = myadd(1,2);//执行委托
}
list使用lambda案例
List<string> lis2 = lis.Where(p=>p.Length>=3).ToList();//返回list中长度大于等于3的元素组成的list
int len = lis.Count(p => p.Length >= 3);//返回list中长度大于等于3的元素的个数
List<bool> lis3 = lis.Select(p=>p.Length>=3).ToList();//返回对应的布尔list
Where/Find/FindAll/Select
实现了IEnumerable接口的类、类型、集合可以使用Linq、Linq的扩展方法where()、FindAll()来查询符合谓词约束的数据。
返回类型
Where里面是用了yert延迟返回,Find是编历所有后才返回。批量返回的时候两者一样的
- Where():检索与指定匹配的所有元素
- Find():检索与指定匹配的第一个元素
- FindIndex():检索与指定匹配的第一个元素的索引,用法同Find()
- FindLast():检索与指定匹配的最后一个元素,用法同Find()
- FindLastIndex():检索与指定匹配的最后一个元素的索引,用法同Find()
- FindAll():检索与指定匹配的所有元素
- Select():相当于批量操作,将序列中的每个元素按照某个方式投影到新序列中
采用的案例List
List<string> list_str = new List<string> { "asdf", "s", "daf", "se", "12", "sf", "sfsdh", "sdg" };
List<int> list_int = new List<int> { 1,5,3,-5,6,8,9,-10,3,66,12,56,28,36,15,35,48,75,69,58,2,6,8,0,2,5};
Find
int lis3 = list_int.Find(p=>p>=10);//寻找第一个大于10的数
string lis3 = list_str.Find(p=>p.Length>=3);//寻找第一个长度大于3的元素
FindAll
List<string> lis3 = list_str.FindAll(p=>p.Length>=3).ToList();//寻找所有长度大于3的元素
List<int> lis3 = list_int.FindAll(p => p>= 10).ToList();//寻找所有大于10的元素
where
List<string> lis3 = list_str.Where(p=>p.Length>=3).ToList();//寻找所有长度大于3的元素
List<int> lis3 = list_int.Where(p => p>= 10).ToList();//寻找所有大于10的元素
Select
List<int> lis3 = list_str.Select(p => p.Length).ToList();//返回每个lis3元素对应的长度
List<bool> lis3 = list_str.Select(p => p.Length>=3).ToList();//返回每个lis3元素对应的长度大于等于3的判断结果
List<string> lis3 = list_int.Select(p => p.ToString()).ToList();//把每个元素映射成对应的字符串
List<int> lis3 = list_int.Select(p => p+1).ToList();//把每个元素都加一
List<int> lis3 = list_str.Select(p => p.Length+100).ToList();//获取每个字符串长度加100的序列
本文详细介绍了C#中的委托概念,强调其安全性和面向对象特性。讨论了Func和Action委托类型,分别展示了它们在有返回值和无返回值情况下的用法。此外,还探讨了匿名方法和Lambda表达式的应用,提供了多个示例展示如何创建和使用它们。最后,文章讲解了如何在 LINQ 查询中利用Where、Find、FindAll和Select方法进行数据过滤和投影。

1245

被折叠的 条评论
为什么被折叠?



