前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq基础知识小记二

Linq基础知识小记二

作者头像
郑小超.
发布2018-01-26 15:51:30
1.3K0
发布2018-01-26 15:51:30
举报
文章被收录于专栏:GreenLeavesGreenLeaves

书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法.

1、方法语法

方法语法就是通过扩展方法和Lambda表达式来创建查询

(1)、链式查询

这种查询方式很多语言都支持,通过一段实例,介绍Linq的链式查询.需求如下:找出字符串数组中含有字母e的字符穿,并按长度排序,最后将结果转为大写.代码如下:

代码语言:javascript
复制
string[] names = {"James","Kobe","Curry","Durrent" };
IEnumerable<string> result = names.Where(n =>n.Contains('e')).OrderBy(n => n.Length)
                .Select(n => n.ToUpper());
foreach (var n in result)
{
     Console.WriteLine(n);
}

链式查询的原理:一个词"扩展方法",核心是扩展方法,因为where、OrderBy、Select等扩展方法返回都是一个IEnumerable<T>类型对象,所以配合扩展方法本身的特殊性(不懂,请参考C# this关键字(给底层类库扩展成员方法)就实现了链式查询的功能.关于这个如果了解jQuery链式查询的可能更容易理解.

(2)、OrderBy、Where、Selet查询方法简单介绍

Where:该方法决定了过滤的规则,也就是按照Where方法中Lambda制定的规则,当前element是否能继续留在数据集合中.

OrderBy:按照Lambda制定的规则对数据集合进行排序.

Select:按照Lambda制定的规则决定了当前数据集合要以怎样的方式输出.

(3)、方法语法中除了Select、OrderBy、Where的其它查询操作符

并不是所有的查询运算符都返回一个IEnumerable<T>,所以使用这类查询操作符之后不能使用其他的查询操作符,这类查询一般出现在查询的最后.如下:

代码语言:javascript
复制
int[] numbers = {1, 2, 54, 546, 7, 87, 8, 9, 66};
int first = numbers.First(n=>n>500);//找出复合Lambda规则的第一个数字,如果不传Lambda,则默认找出目标数组的第一个,注:这里并不会大小上的第一个,而是位置上的第一个
int last = numbers.Last(n=>n>1);//同理,但它是找出最后一个
int firstOne = numbers.OrderBy(n=>n).First(n => n > 500);//对数组进行排序,排序后找出大于500的第一个数
int elementAt = numbers.ElementAt(2);//找出位于数组第三个的数
Console.WriteLine(first + "  " +last+"  "+firstOne+"  "+ elementAt);

还有一些特殊的运算符接收输入两个数据集,如Union和Concat,如下:

代码语言:javascript
复制
int[] arr1 = {1,2,2,1,5,6};
int[] arr2 = {1, 3, 5, 6, 78, 8};
IEnumerable<int> result = arr1.Concat(arr2);//联结两个数组,不去重
IEnumerable<int> result1 = arr1.Union(arr2);//联结两个数组,去重
foreach (var n in result)
{
   Console.Write(n + " ");
}
Console.WriteLine();
foreach (var n in result1)
{
   Console.Write(n+" ");
}

关于类似的方法还有很多,推荐去研究下System.Linq.Enumerable类

2、Linq查询表达式语法

Linq查询表达式语法写出的查询比较类似与Sql语句,是C#3.0加入的,虽然Linq查询表达式看上去类似于Sql查询,但实际上它并不是建立在Sql语句上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensions(列表解析)功能之上,也就是所编译器会对Linq查询表达式进行处理,并编译成扩展方法,实质也是在使用扩展方法进行查询.

下面对1中链式查询的的例子进行改写,使用Linq查询表达式语法,代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var result = from n in names
where n.Contains("e")
orderby n.Length
select n.ToUpper();
foreach (var n in result)
{
      Console.WriteLine(n);
}

查询表达式总是已From子句开始,From子句定义了查询的范围变量,改变量其实就是对数据集合的一个遍历,就像foreach语句那样.

上图是标准的查询表达式语法图

3、组合查询语法

因为查询表达式语法和扩展方法语法各有所长,其实本质上查询表达式编译之后也是一种方法语法,两者是真包含的关系,所以使用起来可以根据自身的喜好来决定,但是当一个查询操作运算符没有对应的查询表达式语法时,那么就需要结合两种方法,来得到我们想要的结果,如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var result = (from n in names where n.Contains("J") select n).Count();//查询name集合中包含字母J的字符串个数
Console.WriteLine(result);

这种组合语法通常在书写更加复杂的查询时会具有优势。像上面这种简单的查询可能使用方法语法就够了.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档