Linq一些知识

1、委托是可以指向方法的类型,调用委托变量时执行的就是变量指向的方法。

2、.NET 中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。

3、Where方法:每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。
Where参数是一个lambda表达式格式的匿名方法,方法的参数e表示当前判断的元素对象。参数的名字不一定非要叫e,不过一般lambda表达式中的变量名长度都不长。

4、Count()方法:获取数据条数
int count1 = list.Count(e => e.Salary > 5000 || e.Age < 30);
int count2 = list.Where(e => e.Salary > 5000 || e.Age < 30).Count();

5、Any()方法:是否至少有一条数据
bool b1 = list.Any(e => e.Salary > 8000);
bool b2 = list.Where(e => e.Salary > 8000).Any();
有可能比Count()实现效率高。

6、获取一条数据(是否带参数的两种写法):
Single:有且只有一条满足要求的数据;
SingleOrDefault :最多只有一条满足要求的数据;
First :至少有一条,返回第一条;
FirstOrDefault :返回第一条或者默认值;
选择合适的方法,“防御性编程”

7、排序:
Order() 对数据正序排序;OrderByDescending() 倒序排序;
list.OrderBy(e => e.Age);
对于简单类型排序,也许不用lambda表达式。特殊案例:按照最后一个字符排序;用Guid或者随机数进行随机排序。

8、多规则排序:
可以在Order()、OrderByDescending()后继续写ThenBy () 、ThenByDescending()。
案例:优先按照Age排序,如果Age相同再按照Salary排序
list.OrderBy(e => e.Age).ThenByDescending(e => e.Salary) ,千万不要写成list.OrderBy(e => e.Age). OrderByDescending (e => e.Salary)

9、限制结果集,获取部分数据:
Skip(n)跳过n条数据,Take(n)获取n条数据。
案例:获取从第2条开始获取3条数据
var orderedItems1 = list.Skip(2).Take(3);Skip()、Take()也可以单独使用。

10、聚合函数:
Max()、Min () 、Average () 、Sum () 、Count ()。
LINQ中所有的扩展方法几乎都是针对IEnumerable接口的,而几乎所有能返回集合的都返回IEnumerable,所以是可以把几乎所有方法“链式使用”的。
list.Where(e => e.Age > 30).Min(e=>e.Salary)

11、分组:
GroupBy()方法参数是分组条件表达式,返回值为IGrouping<TKey, TSource>类型的泛型IEnumerable,也就是每一组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中Key属性表示这一组的分组数据的值。
例子:根据年龄分组,获取每组人数、最高工资、平均工资。用var简化编程。

12、投影:
把集合中的每一项转换为另外一种类型。
IEnumerable ages = list.Select(e => e.Age);
IEnumerable names = list.Select(e=>e.Gender?“男”:“女”);
var dogs = list.Select(p=>new Dog{NickName=e.Name,Age=e.Age});

13、匿名类型:
var p = new {Name=“tom”,Id=1};
var p1 = new {name,Id=1,p.Age};
通过反编译看匿名类型原理。

14、集合转换:
有一些地方需要数组类型或者List类型的变量,我们可以用ToArray()方法和ToList()分别把IEnumerable转换为数组类型和List类型。

15、查询语法
使用Where、OrderBy、Select等 扩展方法进行数据查询的写法叫做 “LINQ方法语法”。还有一种“查询语法”的写法。
var items2 = from e in list
where e.Salary > 3000
orderby e.Age
select new { e.Name, e.Age, Gender = e.Gender ? “男” : “女” };

走进Linq--Linq横空出世篇 某日编程大师云游到某处,见一刚毕业不久学过两天C#和两天SQL的coder在那里发牢骚,为啥我要写这么多for,这么多if才能查询出我需要的数据,为啥我不能像SQL那样,发送一条命令告诉数据库我需要啥样的数据,它就给我返回来。 编程大师如是说:傻小子,像SQL那叫第四代编程语言,常存在于象牙塔和研究所里面的学究语言,还有个高雅的名字:函数编程。它只需要你告诉它要什么,而不需要告诉它怎么做。而你使用的C#语言属于命令式编程,你必须像发送命令一样一步步的告诉你的机器怎么做。 发牢骚的coder回了一句:不懂,我只是想不通,数据库能做这样的处理,为啥C#这么牛的语言不能呢。编程大师心里想着:这是不可能的事情,因为C#它是强类型语言,)*&)(&)*)()*&%&%&^(后面省去200字)。 天色还未晚,编程大师就急匆匆的回家了,他心里一直记着那位发牢骚的coder的话:为什么不能,为什么不能。 晚上,编程大师做了一个梦,一个奇怪的梦,他的师傅“白眉”只说了三个字母:DSL。 编程大师想着,DSL,领域专用语言,师傅要对我说什么呢,难道和今天我遇见的事有关? 上面这段文字是一段调侃,调节一下气氛,呵呵。 我觉得Linq就是一种DSL,在C#等常规语言上抽象起来的,面向数据处理领域的特定“语言”,当然,它的根基还是这些常规语言。 select,from,where,group等关键字本来只是在SQL里出现,现在把它们引入到C#这些常规编程语言中。 那C#等是如何做到的呢?是在CLR底层支持的么?不是。既然“编译器”可以将C#编译成MSIL,那为什么编译不能干更多一点事情?将这些为了领域编程而出现关键字编译成原始语法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值