LINQ to Object——延时执行的Enumerable类方法

LINQ to Object是针对实现了IEnumerable<T>的对象的LINQ。而在System.Linq.Enumerable类中,总共定义了40来个查询运算符----全部用扩展方法来实现,他们被称为标准查询运算符。每个查询运算符的执行行为不同,大致分为立即执行和延时执行。延时执行,顾名思义就是不是立即执行,即不是在查询语句定义的时候执行,而是在处理结果集(如遍历)的时候执行。

常用的延时执行的Enumerable类方法成员,具体如下:

1.Take用于从一个序列的开头返回指定数量的元素

            string[] names = { "张三", "范冰冰", "李冰冰", "迈克尔·杰克逊", "李四", "王五", "赵六", "田七" };

            //在数组上直接使用Take方法
            foreach (string name in names.Take(3))       //获取前三个元素
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");

            //在LINQ返回的IEnumerable<T>序列上使用Take方法
            var take_names = from string name in names
                        where name.Length >= 3       //获取名字长度大于等于3的元素
                        select name;
            foreach (string name in take_names.Take(3))       //获取前三个元素
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

2.TakeWhile 用于获取指定序列从头开始符合条件的元素,直到遇到不符合条件的元素为止

            var takewhile_names = names.TakeWhile(n => n.Length < 4);       //获取从头开始名称长度小于4的元素,遇到不符合条件的就结束
            foreach (string name in takewhile_names)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");

            var takewhile_names2 = names.TakeWhile((n, i) => n.Length < 4 && i < 2);       //获取从头开始名称长度小于4的元素,遇到不符合条件的就结束,并取当前元素索引小于2的元素,即前两个
            foreach (string name in takewhile_names2)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

3.Skip跳过序列中指定数量的元素

            foreach (string name in names.Skip(5))       //跳过前5个元素
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");

            var skip_names = (from name in names
                              where name.Length >= 3       //获得名字长度大于等于3的元素
                              select name).Skip(1);       //跳过前1个元素
            foreach (string name in skip_names.Skip(1))       //再跳过前个元素
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

4.SkipWhile 用于跳过序列中满足条件的元素,然会返回剩下的元素

            var skipwhile_names = names.SkipWhile(n => n.Length < 3);       //跳过名字长度小于3的
            foreach (string name in skipwhile_names)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            var skipwhile_names2 = names.SkipWhile((n, i) => n.Length <= 3 && i >= 0);       //跳过名字长度小于3的,并且取当前索引大于等于的元素,即第一个往后的
            foreach (string name in skipwhile_names2)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

Take和Skip的简单综合应用:获取第M到N个的元素

            var skipandtake_names = names.Skip(5).Take(3);       //获取第6到8的元素
            foreach (string name in skipandtake_names)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");

5.Reverse用于翻转序列中的元素的顺序

            string str = "反转字符串";
            var restr = str.ToCharArray().Reverse();
            foreach (var newstr in restr)
            {
                Console.WriteLine(newstr);
            }
            Console.WriteLine("----------------------------");
var re_names = names.Reverse();
            foreach (var new_names in re_names)
            {
                Console.WriteLine(new_names);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

6.Distinct过滤掉重复的元素

            string[] names2 = { "张三", "范冰冰", "李冰冰", "迈克尔·杰克逊", "李四", "王五", "赵六", "田七", "张三", “大帅哥” };
            var distinct_names = names2.Distinct();

            foreach (var new_names in distinct_names)
            {
                Console.WriteLine(new_names);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

运行结果:

7.Union用于合并两个序列,并去掉重复项

            var union_names = names.Union(names2);
            foreach (string name in union_names)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

8.Concat用于连接两个序列,不会去掉重复项

            var concat_names = names.Concat(names2);
            foreach (string name in concat_names)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine("----------------------------");
            Console.ReadKey();

9.Intersect用于获得连个序列的交集

10.Except用于获得两个结合的差集

11.Range 用于生成指定范围内的“整数”序列

12.Repeat用于生成指定数量的重复元素

13.Empty 用于获得一个指定类型的空序列

14.DefaultIfEmpty 用于获得序列,如果为空,则添加一个默认类型元素

15.OfType筛选指定类型的元素

16.Cast类型转换

17.AsEnumerable有些数据源类型不支持Enumerable的部分查询关键字,需要转换下,譬如IQueryable

未完待续。。。。。。。。

原文地址:https://www.cnblogs.com/jiechou/p/9218420.html

时间: 2024-10-25 07:53:00

LINQ to Object——延时执行的Enumerable类方法的相关文章

LINQ to Object——立即执行的Enumerable类方法

在前面说到LINQ to Object--延时执行的Enumerable类的方法,接下来说说LINQ to Object--立即执行的Enumerable类方法. 1.ToArray 序列转换成数组 List<string> names_list = new List<string> { "张三", "范冰冰", "李冰冰", "迈克尔·杰克逊", "李四", "王五&qu

Linq to OBJECT延时标准查询操作符

1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果. 2.Select  操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中的元素类型相同,也可以不同.下面来看看Select方法的原型. 3.SelectMany 操作符用于根据输入序列中的每一个元素,在输出序列中创建相应的零个或者多个元素,与Select操作符不同,Select操作符会根据输入序列中的每一个元素创建一个对应的输出序列元素,而SelectMany操作符可

Linq延时执行

本文向大家介绍Linq延时执行,可能好多人还不了解Linq延时执行,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西. Linq的大多数查询运算符的一个重要特性就是,他们并不是在构建的时候就立即执行,而是在枚举是执行,换句话说,当枚举变量调用MoveNext时执行. 在构建查询之后,另外插入到列表中的数字也会包含在结构中,因为直到foreach运行时此才回进行筛选或者是排序操作,称之为延时执行或延缓计算,所有标准查询运算符均为延时执行,但是有的运算符不支持延时执行的机制,而是立即执行

iOS:延时执行的三种方式

延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObject (NSDelayedPerforming) ※延时调用在当前线程使用特定模式的方法(如果数组没有数据或者参数为nil,则不会调用selector中方法) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterD

.NET面试题系列[13] - LINQ to Object

.NET面试题系列目录 名言警句 "C# 3.0所有特性的提出都是更好地为LINQ服务的" - Learning Hard LINQ是Language Integrated Query(语言集成查询)的缩写,读音和单词link相同.不要读成“lin-Q”. LINQ to Object将查询语句转换为委托.LINQ to Entity将查询语句转换为表达式树,然后再转换为SQL. LINQ的好处:强类型,相比SQL语句它更面向对象,对于所有的数据库给出了统一的操作方式. LINQ的一些

Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍

无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和InsertAllOnSubmit,前者是将一个实体标记为一个插入状态,而后都是将一个集合标记为插入状态,... 无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit

(第一篇) 一步一步带你了解linq to Object

要想学好linq to object 我们必须要先学习lambda 表达式,学习lambda 表达式呢我们必须了解匿名函数和匿名类,学习匿名函数,我们必须学会委托,这是本文的宗旨.下面开始第一步.在第一步开始之前,我们做点准备工作,建立一个学生类和一个班级类,类结构如下 public class Student { public int Id { get; set; } public int ClassId { get; set; } public string Name { get; set;

Linq to Object 的简单使用示例

语言集成查询 (LINQ) 是 Visual Studio 2008 中引入的一组功能,可为 C# 和 Visual Basic 语言语法提供强大的查询功能. LINQ 引入了标准易学的数据查询和更新模式,可以扩展该方法来支持任何类型的数据存储. Visual Studio 包括 LINQ 提供程序集,后者支持将 LINQ 与 .NET Framework 集合.SQL Server 数据库.ADO.NET 数据集和 XML 文档结合使用. LINQ特有的编程结构: 隐式类型本地变量:C#的va

解析LINQ To Object

1.解剖Linq to object   此文转载自http://www.cnblogs.com/irenebbkiss/p/4155480.html LINQ想必大家都不陌生了,它 的出现使得我们的代码变得更短.更优雅了.至于LINQ是什么,Linq to object这类的扩展方法到底做了些什么.我们使用的EF是如何实现的(如何解析Expression).我都将一一为大家分享下我的理解.如果有说得 不对的地方,也请大家指出.下面进入正题 大家先将代码左上角的using System.Linq