匿名函数及委托的使用:

 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的更多相关文章

  1. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  2. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

  3. 动态生成C# Lambda表达式

    转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为 ...

  4. 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型

    this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查询 }); 跨线程调用时,编译上面的代码将提示 对于Control.In ...

  5. lambda表达式不使用委托(delegate) 用FUNC

    lLambda不使用delegate关键字,而使用  Lambda运算符 => goes to l    1.Func<int,string> getInput = (int age ...

  6. 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型

    今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...

  7. C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别

    以前一直迷迷糊糊的,现在总算搞明白. Lambda表达式 Lamda表达式基本写法是()=>{ };Lambda和方法一样都可以传入参数和拥有返回值.(int x)=>{return x; ...

  8. 处理跨线程操作问题(使用Action和delegate或lambda表达式)

    方法A: Action f = () =>                    {                       txtProcess.Text = "开始更新程序.. ...

  9. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

随机推荐

  1. MongoDB模拟多文档事务操作

    Mongodb不支持多文档原子性操作,因此依据两阶段提交协议(Two Phase Commits protocol)来模拟事务. 以两个银行账户之间的转账行为为例,来说明如何实现多文档间的事务操作. ...

  2. 试用最强Spark IDE--IDEA

    1.安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示 ...

  3. [学习OpenCV攻略][003[初试牛刀——显示图片]

    cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...

  4. java如何获取一个对象的大小

    When---什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的.但当一个系统的内存有限,或者某块程序代码允许使用的内存大小有限制,又或者设计一个缓存 ...

  5. 10年java过来人聊聊自己的自学、培训和工作经历

    一 . 自我介绍 我叫王涛,我是一位北漂十年的码农,2008年9月份开始自学java,三个月后,自学无果,于2008年11月份开始参加培训,培训完之后,我觉得自己还是啥也不会,只会抄抄代码,竟然连de ...

  6. Maven中央仓库源地址改为阿里云(IDEA)

    我的Maven是IDEA2017.1.2集成的,所以settings.xml在此位置 E:\Program Files\JetBrains\IntelliJ IDEA 2017.1.2\plugins ...

  7. iptables命令 高级网络

    http://man.linuxde.net/iptables iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分.可以直接配置,也可以通过许多前端和图形界面配置. ...

  8. Yourphp系统发生错误

    今天早用YP更新缓存,弹出如下错误: 随之而来的是错误信息是: [php] view plain copy [14-12-03 10:48:12] E:\wwwweb\xmwszt360\Core\L ...

  9. win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音

    从网上下载wampserver2.5 64位的PHP集成环境,根本无法使用,说是丢失了MSVCR110.DLL,然后再网上找了一大堆资料工具都无用,比如下微软的了vcredist_x64,重新卸载安装 ...

  10. [转载]利用memcached在多台服务器之间共享PHP的session数据

    原文地址:利用memcached在多台服务器之间共享PHP的session数据作者:a1049709658 最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大&quo ...