Delegate &&Lambda
匿名函数及委托的使用:
public delegate void NoReturnNoParaOutClass();//delegate can be defined in class or out of class
public sealed class LambdaShow
{
public delegate void NoReturnNoPara();//1 委托的声明 委托是一种类型
public delegate int WithReturnNoPara();
public delegate void NoReturnWithPara(int id, string name);
public delegate LambdaShow WithReturnWithPara(DateTime time);
public delegate LambdaShow WithReturnWithParaRefOut(ref DateTime time, out int i); public void Show()
{
Student student = new Student()
{
Id = ,
Name = "Smith"
};
student.Study(); {
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing1);//2委托的实例化
method.Invoke();//3 委托实例的调用
method();
this.DoNothing1();
}
{
NoReturnWithPara method = new NoReturnWithPara(this.DoNothing);
//NoReturnWithPara method = this.DoNothing;
method.Invoke(, "珍惜");
}
{
NoReturnWithPara method = new NoReturnWithPara(
delegate (int id, string name)//匿名方法
{
Console.WriteLine($"{id} {name} DoNothing out");
}
);
method.Invoke(, "绚烂的夏");
}
{
NoReturnWithPara method = new NoReturnWithPara(
(int id, string name) =>//goes to lambda表达式:匿名方法--方法
{
Console.WriteLine($"{id} {name} DoNothing out");
}
);
method.Invoke(, "追梦");
}
{
NoReturnWithPara method = new NoReturnWithPara(
(id, name) =>//委托约束,去掉参数类型,自动推算
{
Console.WriteLine($"{id} {name} DoNothing out");
}
);
method.Invoke(, "装逼的岁月");
}
{
NoReturnWithPara method = new NoReturnWithPara(
(id, name) => Console.WriteLine($"{id} {name} DoNothing out")
//方法体只有一行,就可以把大括号和分号去掉
);
method.Invoke(, "美羡");
}
{
NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} DoNothing out");
//委托实例化的时候可以不要new NoReturnWithPara
method.Invoke(, "晴月");
}
} private void DoNothing(int id, string name)
{
//Console.WriteLine("{0} {1} DoNothing out",id, name);
Console.WriteLine($"{id} {name} DoNothing out");
} private void DoNothing1()
{
Console.WriteLine("DoNothing1");
} private void DoNothing2()
{
Console.WriteLine("DoNothing2");
}
}
}
委托的简单介绍
系统自带delegate...(来自System)
Action 无返回值
#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
#endregion namespace System
{
//
// 摘要:
// 封装一个方法,该方法只有一个参数并且不返回值。 若要浏览此类型的.NET Framework 源代码,请参阅Reference Source。
//
// 参数:
// obj:
// 此委托封装的方法的参数。
//
// 类型参数:
// T:
// 此委托封装的方法的参数类型。
public delegate void Action<in T>(T obj);
}
Func: 带返回值
#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
#endregion using System.Runtime.CompilerServices; namespace System
{
//
// 摘要:
// 封装一个方法,该方法不具有参数,且返回由 TResult 参数指定的类型的值。
//
// 类型参数:
// TResult:
// 此委托封装的方法的返回值类型。
//
// 返回结果:
// 此委托封装的方法的返回值。
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
public delegate TResult Func<out TResult>();
}
匿名类型 Var:
//1 只能声明局部变量,不能是字段、也不能是静态属性
//2 声明的时候必须被初始化;
var model = new
{
Id = ,
Name = "Alpha Go",
Age = ,
ClassId =
}; Console.WriteLine(model.Id);
Console.WriteLine(model.Name);
//model.Name = "张伟东";//只读,不能更改。
扩展方法:
/// <summary>
/// 扩展方法:就是在不修改类型封装前提下,给类型额外的扩展一个方法
///
/// 不能滥用,尤其是一些基类型-->object
/// </summary>
public static class ExtendShow
{
/// <summary>
/// 扩展方法:静态类里的静态方法,第一个参数类型前面加上this
/// </summary>
/// <param name="iParameter"></param>
/// <returns></returns>
public static int ToInt(this int? iParameter) //int? 表示类型可null可int,常用于数据库。
{
return iParameter ?? -;//if null return -1; else return itself.
} public static void ExtendLambdaShow(this LambdaShow lambda, int iParameter, string sParameter)
{
Console.WriteLine($"LambdaShow=={iParameter}==={sParameter}");
}
/// <summary>
/// 如果跟实例方法相同,优先实例方法
/// </summary>
/// <param name="lambda"></param>
public static void Show(this LambdaShow lambda)
{
Console.WriteLine($"LambdaShow");
} //不能滥用,尤其是一些基类型-->object
public static void DoNothing(this object oParameter)
{ }
Linq:(利用扩展方法,借助lambda表达式筛选)
/// <summary>
/// 准备数据
/// </summary>
/// <returns></returns>
private List<Student> GetStudentList()
{
#region 初始化数据
List<Student> studentList = new List<Student>()
{
new Student()
{
Id=,
Name="打兔子的猎人",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Alpha Go",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="白开水",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="狼牙道",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Nine",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="Y",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="小昶",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="yoyo",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="冰亮",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="瀚",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="毕帆",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="一点半",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="小石头",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="大海",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="yoyo",
ClassId=,
Age=
},
new Student()
{
Id=,
Name="unknown",
ClassId=,
Age=
}
};
#endregion
return studentList;
}
GetStudentList()
//
// 摘要:
// 基于谓词筛选值序列。
//
// 参数:
// source:
// System.Collections.Generic.IEnumerable`1 进行筛选。
//
// predicate:
// 用于测试每个元素是否满足条件的函数。
//
// 类型参数:
// TSource:
// 中的元素的类型 source。
//
// 返回结果:
// System.Collections.Generic.IEnumerable`1 ,其中包含输入序列中满足条件的元素。
//
// 异常:
// T:System.ArgumentNullException:
// source 或 predicate 为 null。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); //在Func<TSource, bool> predicate中:TSource是输入参数类型,bool是输出参数类型. //
// 摘要:
// 封装一个方法,该方法具有一个参数,且返回由 TResult 参数指定的类型的值。 若要浏览此类型的.NET Framework 源代码,请参阅Reference
// Source。
//
// 参数:
// arg:
// 此委托封装的方法的参数。
//
// 类型参数:
// T:
// 此委托封装的方法的参数类型。
//
// TResult:
// 此委托封装的方法的返回值类型。
//
// 返回结果:
// 此委托封装的方法的返回值。
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
public delegate TResult Func<in T, out TResult>(T arg);
借助反编译工具查看源码(迭代器没搞清楚,以后补充)
// System.Linq.Enumerable
/// <summary>Filters a sequence of values based on a predicate.</summary>
/// <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1" /> to filter.</param>
/// <param name="predicate">A function to test each element for a condition.</param>
/// <typeparam name="TSource">The type of the elements of <paramref name="source" />.</typeparam>
/// <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1" /> that contains elements from the input sequence that satisfy the condition.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="source" /> or <paramref name="predicate" /> is <see langword="null" />.</exception>
[__DynamicallyInvokable]
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (source is Enumerable.Iterator<TSource>)
{
return ((Enumerable.Iterator<TSource>)source).Where(predicate);
}
if (source is TSource[])
{
return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
}
if (source is List<TSource>)
{
return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
}
return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
}
public static IEnumerable Where(this IEnumerable source, Func<TSource, bool> predicate)源码
/// <summary>
/// IEnumerable是集合的初始接口
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <param name="source"></param>
/// <param name="predicate"></param>
/// <returns></returns>
public static IEnumerable<TSource> ElevenWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw new Exception("source");
}
if (predicate == null)
{
throw new Exception("predicate");
} //常规情况下数据过滤
List<TSource> studentListLessThan30 = new List<TSource>();
foreach (var student in source)
{
//if (item.Age < 30)
if (predicate(student))
{
studentListLessThan30.Add(student);
}
}
return studentListLessThan30;
}
模拟Where
{
var list = studentList.ElevenWhere<Student>(s =>
{
Console.WriteLine("");
return s.Age < ;
});//linq
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name} Age={item.Age}");
}
//linq to object
}
测试模拟的Where
{
//查询运算符
var list = studentList.Where<Student>(s => s.Age < && s.Name.Length > );//陈述句
foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.Name, item.Age);
}
} {
//查询表达式
Console.WriteLine("********************");
var list = from s in studentList
where s.Age < && s.Name.Length >
select s; foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.Name, item.Age);
}
}
(不是Sql)
#region linq to object Show
{
Console.WriteLine("********************");
var list = studentList.Where<Student>(s => s.Age < )
.Select(s => new
{
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
});
foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
}
}
{
Console.WriteLine("********************");
var list = from s in studentList
where s.Age <
select new
{
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
}; foreach (var item in list)
{
Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName);
}
}
{
Console.WriteLine("********************");
var list = studentList.Where<Student>(s => s.Age < )
.Select(s => new
{
Id = s.Id,
ClassId = s.ClassId,
IdName = s.Id + s.Name,
ClassName = s.ClassId == ? "高级班" : "其他班"
})
.OrderBy(s => s.Id)
.OrderByDescending(s => s.ClassId)
.ThenBy(s => s.ClassId)//排序
.Skip()//跳过 分页
.Take()//获取数据
;
foreach (var item in list)
{
Console.WriteLine($"Name={item.ClassName} Age={item.IdName}");
}
}
List<Class> classList = new List<Class>()
{
new Class()
{
Id=,
ClassName="初级班"
},
new Class()
{
Id=,
ClassName="高级班"
},
new Class()
{
Id=,
ClassName="微信小程序"
},
};
{
//inner join
var list = from s in studentList
join c in classList on s.ClassId equals c.Id
select new
{
Name = s.Name,
ClassName = c.ClassName
};
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.ClassName}");
}
}
{
var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
{
Name = s.Name,
ClassName = c.ClassName
});
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.ClassName}");
}
}
{//左连接 (只有左连接,无右连接)右连接就反过来
var list = from s in studentList
join c in classList on s.ClassId equals c.Id
into scList
from sc in scList.DefaultIfEmpty()
select new
{
Name = s.Name,
ClassName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用
};
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.ClassName}");
}
Console.WriteLine(list.Count());
}
{
var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
{
Name = s.Name,
CalssName = c.ClassName
}).DefaultIfEmpty();//为空就没有了
foreach (var item in list)
{
Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
Console.WriteLine(list.Count());
}
#endregion
Linq to Object 投影
Delegate &&Lambda的更多相关文章
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- C# delegate event func action 匿名方法 lambda表达式
delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...
- 动态生成C# Lambda表达式
转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为 ...
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查询 }); 跨线程调用时,编译上面的代码将提示 对于Control.In ...
- lambda表达式不使用委托(delegate) 用FUNC
lLambda不使用delegate关键字,而使用 Lambda运算符 => goes to l 1.Func<int,string> getInput = (int age ...
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...
- C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别
以前一直迷迷糊糊的,现在总算搞明白. Lambda表达式 Lamda表达式基本写法是()=>{ };Lambda和方法一样都可以传入参数和拥有返回值.(int x)=>{return x; ...
- 处理跨线程操作问题(使用Action和delegate或lambda表达式)
方法A: Action f = () => { txtProcess.Text = "开始更新程序.. ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
随机推荐
- 创建jedis对象
1.先在taotao-parent的pom.xml中复制 以下内容到rest的pom.xml中 <!-- Redis客户端 --> <dependency> <group ...
- 制作ssh互信的docker镜像
Dockerfile FROM ubuntu:16.04 # package RUN apt-get update; apt-get -y install ssh COPY ssh_config /e ...
- [国嵌攻略][154][Linux-I2C子系统]
IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...
- 从零开始学习前端开发 — 2、CSS基础
一.CSS简介 1.CSS是什么 CSS是Cascading Style Sheets的简称,中文称为层叠样式表.特点:实现了表现与结构相分离 2.css基础语法 css是由选择符和声明两大部分组成 ...
- mac通过自带的ssh连接Linux服务器并上传解压文件
需求: 1:mac连接linux服务器 2:将mac上的文件上传到linux服务器指定位置 3:解压文件 mac上使用命令,推荐使用 iterm2 .当然,也可以使用mac自带的终端工具. 操作过程: ...
- @ property 与@ synthesize 的作用 VS @interface
表示声明了一个实例属性和它的getter和setter器 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的:而用@property声明的变量可以在外部 ...
- CSS3 三角形运用
酷酷的 CSS3 三角形运用 概述 在早期的前端Web设计开发年代,完成一些页面元素时,我们必须要有专业的PS美工爸爸,由PS美工爸爸来切图,做一些圆角.阴影.锯齿或者一些小图标. 在CSS3出现 ...
- 微信小程序实战:天气预报
接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...
- 译-BMC Remedy Action Request System权限控制概述
原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于IT ...
- POI--HSSFCellStyle类
通过POI来进行单元格格式的设定 设定格式使用「HSSFCellStyle」类.它有一个构造方法: protected HSSFCellStyle(short index, ExtendedForma ...