vs2008 使用LINQ来简化编程的7个技巧

合集下载

linq语法

linq语法

linq语法
Linq(language integrated query, 语言集成查询)本质上是一种使用类似SQL的
句法来访问数据的语言,它提供了一种新的方式编写程序,可以帮助我们增强程序的灵活
性和可用性。

Linq不仅可以应用于数据库操作,而且它也可以用于检索和修改内存中的数据集合,而且这些操作在不同数据源之间统一。

Linq实际上是一种编程模型,可以作用于多种数据源,提供查询语言的功能。

Linq的核心是提供一种把数据与操作连接起来的新的编程方式。

Linq提供了一种更具有抽象性和简化性的编程结构,可以把一些复杂的的程序操作变得简单而可行。

可以把所需要的数据表达式写在查询中,而不是在一个冗长的 While 循
环中。

Linq可以使编写检索数据的代码变得更简单和更高效,这是因为Linq语言专为解
决查询数据而设计:它以声明性的形式提供了一种把数据与程序元素结合的新方式。

Linq除了结合数据库操作之外,它还可以用于筛选大量数据,提取要求的一组数据,比较两个数据集合的异同点等等,它的优势就在于,即使是不太熟悉编程的用户也能够轻
易的实现复杂的查询。

LINQ 学习

LINQ 学习

第一章LINQ TO SQL 基础1. 什么是LINQ在C#3.0中提出了诸如Lambda表达式、查询语法等一系列新的特性,这些新的特性帮助我们将查询数据理解为一个类编程的理念。

我们称这个总的查询编程模型为“LINQ”--它指的是.NET 语言集合查询。

LINQ 支持这样一个非常广泛的的扩展模型:该模型是针对不同的数据源而生成不同的高效的操作因子。

.NET Framework 3.5版本内嵌了LINQ语言对对象,XML、实体、数据集和数据库的支持的词典,它所要解决的就是对象不等于数据的问题。

LINQ体系结构图如下:2. 什么是LINQ to SQL通过上图我们已经可以看到了,LINQ to SQL其实就是LINQ对于数据库的支持,它是O/RM(对象关系映射)在.NET Framework 3.5中的一种实现,它允许你用.NET 的类来生成一个关系型的数据库。

然后你可以用LINQ对从该对象中对数据库进行查询,更新/插入/删除。

LINQ to SQL完全支持事务,视图和存储过程。

它还提供了一种方便地在你的数据模型中对集合数据验证和业务逻辑规则的进行验证的方法。

在LINQ to SQL中,我们可以像下面的代码这样编写查询:Code1:在正式学习LINQ to SQL之前,我们需要先来熟悉一下C#3.0中的一些新特性,这些新的特性也是为了LINQ而产生的。

3. 隐含类型局部变量这是一个语言层面的功能,局部变量被声明为var,这个声明被视为隐含类型局部变量声明,然后由编译器根据局部变量初始化表达式来推断变量的类型。

如下面的声明:Code2:要注意的是var在这里是仅仅是一个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于:在Code2中,变量integer仍然具有强类型,可以做如下测试:Code4:编译时会报Cannot implicitly convert type 'string' to 'int'错误。

第16章 LINQ数据库技术

第16章 LINQ数据库技术

16.3 LINQ和数据库操作
16.3.1 LINQ to SQL

在LINQ到SQL中,关系数据库的数据模型映射到 开发人员所使用的编程语言表示的对象模型。当 应用程序运行时,LINQ到SQL会将对象模型中的 语言集成查询转换为SQL,然后将它们发送到数 据库进行执行。当数据库返回结果时,LINQ到 SQL会将它们转换回开发者使用的编程语言处理 对象。
16.2 LINQ基础知识
16.2.2 LINQ基本查询



from子句 查询表达式必须以from子句开头。它同时指定了数据源和 范围变量。在对源序列进行遍历的过程中,范围变量表示 源序列中的每个后续元素。将根据数据源中元素的类型对 范围变量进行强类型化。 select子句 使用select子句可产生所有其他类型的序列。简单的select子 句只是产生与数据源中包含的对象具有相同类型的对象的 序列。 group 子句 使用group子句可产生按照指定的键进行分组的序列。键可 以采用任何数据类型。
16.5 QueryExtender控件

QueryExtender控件支持多种可用于筛选数据的选项。该控件 支持搜索字符串、搜索指定范围内的值、将表中的属性值与 指定的值进行比较、排序和自定义查询。在QueryExtender 控件中以LINQ 表达式的形式提供这些选项。QueryExtender 控件还支持动态数据专用的表达式。
16.5 QueryExtender


QueryExtender控件是为了简化LinqDatasource控件 或EntityDataSource控件返回的数据过滤而设计的, 它主要是将过滤数据的逻辑从数据控件中分离出 来。 QueryExtender控件的使用非常简单,只需要往页 面上增加一个QueryExtender控件,指定其数据源 是哪个控件并设置过滤条件就可以了。比如,当 在页面中显示产品的信息时,你可以使用该控件 去显示那些在某个价格范围内的ຫໍສະໝຸດ 品,也可以搜 索用户指定名称的产品。

LINQ中文教程

LINQ中文教程

LINQ中文教程一、LINQ概述LINQ是一种查询技术,它允许开发人员使用统一语法进行查询,无论是对于集合、数据库、XML还是其他数据源。

它支持对数据源进行过滤、排序、分组和投影等操作。

LINQ主要有以下几个方面的特点:1.统一的查询语法:LINQ提供了一种统一的查询语法,无论是对于集合还是其他数据源,开发人员都可以使用相同的语法进行查询。

2.编译时类型检查:LINQ的查询表达式是在编译时进行类型检查的,这样可以在编译时就发现错误,提高了代码的健壮性。

3.延迟加载:LINQ的查询通常支持延迟加载,只有在需要结果时才会执行查询操作,这样可以提高性能和效率。

4.集成查询:通过LINQ,可以对多个数据源进行集成查询,无论是集合、数据库还是XML等,都可以使用相同的查询语法进行查询和操作。

5.可组合性:LINQ的查询操作可以进行组合,可以将多个查询操作串联起来,形成复杂的查询链。

二、LINQ的用法1.查询语法LINQ提供了一种类似于SQL的查询语法,通过关键字from、where、select等来描述查询过程。

例如,对于一个整数集合,可以使用如下的查询语法来查询大于10的数字:```var query = from num in numberswhere num > 10select num;```其中,numbers是一个整数集合,num是每个元素的别名,select num表示选择满足条件的元素。

2.方法语法除了查询语法,LINQ还提供了一种方法语法,通过调用特定的查询方法来实现查询。

例如,对于上述的查询,可以使用方法语法来实现:```var query = numbers.Where(num => num > 10);```其中,Where是一个查询方法,num => num > 10表示一个Lambda表达式,表示筛选大于10的数字。

3.查询结果的使用通过LINQ的查询语法或方法语法,可以得到一个查询结果,可以将其转换为各种类型,进行进一步的操作。

目前本人收集的最全的LINQ入门资料大家一起LINQ吧

目前本人收集的最全的LINQ入门资料大家一起LINQ吧

目前本人收集的最全的LINQ入门资料大家一起LINQ吧入门教程系列1LinqtoSql(一):DataConte某t与实体LinqtoSql(二):增删改LinqtoSql(三):查询句法LinqtoSql(四):存储过程LinqtoSql(五):探究特性LinqtoSql(六):并发与事务LinqtoSql(七):继承与关系Linqtoql(八):其它入门教程系列2LINQ体验(1)——ViualStudio2022新特性我平时利用课余零碎时间来学习3.5、LINQ、Silverlight、3.5E某tenion等新东西,通过笔记形式来记录自己所学的历程,也给大家一起学习ViualStudio2022和.NET3.5提供一个平台,为保证此系列的完整性,我打算先依次介绍一下C#3.0新语言特性和改进,然后从一条一条LINQ语句分析来贯穿LINQ的知识点……LINQ体验(2)——C#3.0新语言特性和改进(上篇)LINQ体验(3)——C#3.0新语言特性和改进(下篇)LINQ体验(4)——LINQ简介和LINQtoSQL语句之WhereLINQ是LanguageIntegratedQuery的简称,它是集成在.NET编程语言中的一种特性。

已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。

并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。

…LINQ体验(5)——LINQtoSQL语句之Select/Ditinct和Count/Sum/Min/Ma某/AvgLINQ体验(6)——LINQtoSQL语句之Join和OrderByLINQ体验(7)——LINQtoSQL语句之GroupBy/Having和E某it/In/Any/All/Contain我们继续讲解LINQtoSQL语句,这篇我们来讨论GroupBy/Having操作符和E某it/In/Any/All/Contain操作符。

第17章 LINQ技术

第17章  LINQ技术
第17章 LINQ技术
本书第三章3.8小节,曾经简单的介绍过LINQ,并举了一个 使用LINQ的Windows应用程序.本章将学习如何在 应用LINQ,讨论LINQ的基础以及详细的查询使用方法. LINQ是.NET 3.5中的新的特性,它提供了统一的语法来查 询多种异构的数据源,开发人员可使用任何.NET语言比如 C#或者是来查询数据源中的数据,而不用去管各种 异构数据源之间的差异.LINQ允许开发人员查询任何实现 了IEnumerable<>接口的集合,比如Array,List,XML,DOM或 者是SQL Server数据表.LINQ提供了编译时的类型安全检 查和动态类型组合等好处.
17.1.2 延迟执行
所谓延迟执行,是指LINQ语句在查询结束后,并没有存储 实际的结果,当通过foreach语句遍历时,才会产生输出结 果. 在Button1的代码中,使用foreach语句直接查询staff数组, staff是一个存在的有数据的集合对象.而LINQ语法中,使 用foreach遍历result时,result并不是一个包含数据的集 合,这是一个特定的LINQ对象,它是 System.Linq.Enumerable类中嵌入的一个私有类,名为 WhereIterator<T>类型的实例. 依赖于不同的查询语句,result可能为不同的对象,比如 如果是一个联合表达式查询,则返回一个私有的 UnionIterator<T>类型的实例,如果只是简单的查询而没 有Where子句,则返回一个简单的SelectIterator<T>类型 的实例.
17.1.6 过滤和排序
可以使用where子句来过滤结果,比如在17.1.1中的示例使 用where过滤字符串大于4的值.where子句将根据条件表达 式来计算每个集合项,如果符合条件,则包含在结果集合 中.同样的,LINQ使用延迟执行特性. 在where子句中,可以组合多个条件表达式,比如使用&&或 者是||连接多个条件,使用标准的运算符等等.还可以直 接使用一个方法来指定过滤条件. 下面创建一个名为CheckBookPrice的方法来检查书籍价格 大于50的书籍,代码如下: //创建一个外部方法 protected bool CheckBookPrice(Book book) { return book.Price > 50; }

linq或用法 -回复

linq或用法-回复如何使用LINQ(语言集成查询)进行数据查询和操作。

LINQ(Language Integrated Query)是.NET框架中的一个功能强大的查询工具,它允许开发人员使用统一的语法查询和操作各种数据源,如对象、集合、数据库和XML等。

本文将详细介绍LINQ的使用方法,包括查询操作符、延迟求值、数据排序和过滤等。

第一步:创建LINQ查询在开始使用LINQ之前,首先需要明确你要查询的数据源是什么。

这可以是一个对象集合、数据库表、XML文件等等。

假设我们要从一个对象集合中查询数据,首先需要创建一个表示该集合的对象。

csharpList<int> Numbers = new List<int> { 1, 2, 3, 4, 5, 6 };在上面的代码中,我们创建了一个名为Numbers的整数列表,其中包含了从1到6的数字。

第二步:使用查询操作符一旦我们创建了数据源,就可以使用查询操作符来对数据进行查询和操作。

常见的查询操作符包括Where、Select、OrderBy等。

下面将介绍一些常用的查询操作符。

1. Where:用于根据指定的条件筛选数据。

例如,我们可以使用Where 操作符来筛选出大于3的数字。

csharpvar result = Numbers.Where(n => n > 3);在上面的代码中,我们使用Where操作符和Lambda表达式来筛选出大于3的数字,结果将存储在result变量中。

2. Select:用于选择指定的数据。

例如,我们可以使用Select操作符来选择数字的平方。

csharpvar result = Numbers.Select(n => n * n);在上面的代码中,我们使用Select操作符和Lambda表达式来选择数字的平方,结果将存储在result变量中。

3. OrderBy:用于按照指定的属性对数据进行排序。

如何使用LINQ检索和操作数据库

如何使用LINQ检索和操作数据库日期:2009年7月10日作者:人气:35 查看:[大字体中字体小字体]借助于LINQ提供的各种功能和独有的语法结构,LINQ已经被用来作为一种统一的数据库访问技术而被广泛使用,用以消除从数据访问层到数据源层出不穷的区别。

通过LINQ检索,我们已经可以不用自己编写一行代码来从数据库获取到数据,LINQ和SQL之间提供了一个直接映射关系,它可以通过我们事先指定的数据库连接自动生成数据库实体类,而我们只需要通过LINQ语句操作这些实体对象就可以非常轻松地从数据库中获取到数据。

当然,LINQ所生成的实体对象的功能远远不止这些,它甚至支持数据的更新和存储过程的调用,所有这些都可以通过简单的几行LINQ语句来完成,让我们真正摆脱了编写数据访问层、数据库实体类的工作。

下面就让我们来看看LINQ的神奇功能吧!使用LINQ生成数据库实体类Visual Studio 2008集成开发环境为我们提供了很多有用的功能来实现LINQ to SQL。

为了让读者可以自行尝试本文所举的示例,读者可能需要在本地安装一个SQL Server数据库实例,Northwind是微软官方提供的一个不错的例子,如果你本地没有安装这个实例,可以去下面这个地址下载:/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en我们在Visual Studio 2008中新建一个控制台应用程序,取名为LINQExample,然后打开Server Explorer窗口并连接到Northwind数据库。

如果找不到Server Explorer窗口,可以通过View-Server Explorer菜单打开。

在Server Explorer窗口中,右键单击Data Connection节点,选择Add Connection,在弹出的窗口中选择Northwind数据库。

vs2008上使用pclint工具

vs2008上使用pc-lint工具管超1.概述Pc-lint是一套检查代码潜在隐患的工具,借助该工具可以辅助我们检查代码中的问题。

本文以pc-lint9.00L版本为例,说明如何在vs2008中集成并使用pc-lint。

Pc-lint9.00L见附件。

2.安装pc-lint9.00L本文以C:\lint为例进行安装,直接解压到相应目录即可,已经完成了pclint对应补丁的安装。

注意:pc-lint对检查源文件的路径名支持的不好,在路径中尽量不要包含空格及中文名。

解压后的pc-lint如下所示。

注意其中的std.lnt文件和options.lnt文件。

本文假设vs2008安装在C盘的默认目录下。

如果不是在该目录,需要更改options.lnt下的对应路径其中std.lnt文件的内容如下://PC-Lint配置文件的入口,除了env-xxx.lnt和project.lnt外,其他配置文件都在本文件包含。

//以下列出了常用的配置文件,如果需要,将前面的注释符去掉即可。

//编译器配置文件//co-diab.lnt //Tornado diab//co-cb.lnt //Borland C++ Builder//co-gcc.lnt //GNU C/C++//co-kc51.lnt //Keil C51// co-msc60.lnt //Microsoft Visual C++ 6.0//co-msc70.lnt //Microsoft Visual C++ .net// co-msc71.lnt //Microsoft Visual C++ .net 2003//co-msc80.lnt //Microsoft Visual C++ .net 2005co-msc90.lnt //Microsoft Visual C++ .net 2008//co-tc.lnt //Turbo c/c++//co-ti320.lnt //Texas Inst. TI320 Class C//库配置文件lib-mfc.lnt //Microsoft Foundation Class Librarylib-stl.lnt //Standard Template Library//lib-vxw.lnt //VxWorks Library//Effective C++条款//lib-sm3.lnt //Effective C++ 3rd Edition//用户的配置文件options.lnt//目标机的字宽-si4 //sizeof(int) equal 4//-si2 //sizeof(int) equal 2//目标机的地址空间-sp4 //size of pointer equal 4//tab键代表几个空格-t4Options的文件内容如下// PC-lint warning options configuration.//// Please note -- this is a representative set of error suppression// options. Please adjust to suit your own policies // See manual (chapter LIVING WITH LINT)// for further details.//VS头文件的搜索路径,从工程配置中获取-i"c:\lint\"-i"c:\lint\lnt\"-i"c:\Program Files\Microsoft Visual Studio 9.0\VC\include"-i"c:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include"-i"C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\"-i"c:\Program Files\Microsoft Visual Studio 9.0\VC\include"-i"c:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include"-i"c:\Program Files\Microsoft SDKs\Windows\v6.0A\include"-i"c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include"-i"c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include" -i"C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\include\"-i"c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include"-i"c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include" -i"c:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\include"-i"SC\dpt\messageManager\include"-i"SC\dpt\video\include"-i"SC\dpt\audio\include"-i"SC\dpt\conf\include"-i"SC\dpt\SCModuleDef"-i"SC\dpt\tipMessage\include"-i"SC\dpt\callObject\include"-i"SC\dpt\functionBtnState\include"-i"SC\dpt\callState\include"-i"SC\dpt\PTZ\include"-i"SC\wb\include"-i"SC\dpt\common\include"-i"SC\dpt\callManager\include"-i"sc\dpt\channelManager\include"-i"SC\dpt\scall\include"-i"SC\dpt\entry\include"-i"SC\documentTransfer"-i"SC\dpt\Utils"-i"lib\db\include"-i"lib\xml\include"-i"IF\if_sipDev\include"-i"IF\entry\include"-i"lowlayer"-i"lowlayer\osal"-i"lowlayer\osal\windows\include"-i"lowlayer\utils"-i"sip\rvSip\include\"-i"include"-i"sip\sipiModule\include"-i"lib\audio\include"-i"lib\video\include"-i"UI\ctrl\include"-i"UI\common\include"-i"UI\exsrc\gdip\include"-i"UI\view\include"-i"UI\view\basecontrol\include"-i"log\include"-i"UI\exsrc\controls\include"-i"UI\view\controlp\include"-i"UI\model\include"-i"log\include"-i"lib\wb\inc"-i"..\.\SDK\boost\include"-i"UI\common\include"-i"..\..\..\..\.\interfaces\boost-1.48.0"-i"Utils"-i"register"-i"..\..\..\..\.\interfaces\rvsipstack\6.0.7\linux\include\sip"//用户头文件搜索路径//-i"xxxx"//Makefile中定义的编译宏//-D__VXWORKS__//以下设置为默认设置,不建议修改。

linq to sql 系列之 linq to sql性能优化技巧

linq to sql 是一个代码生成器和ORM 工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。

但是也有几个测试证明显示在做好优化的情况下,linq to sql 的性能可以提升到 datareader 性能的93%。

因此我总结了linq to sql 的10个性能提升点,来优化其查询和修改的性能。

1. 不需要时要关闭 DataContext 的ObjectTrackingEnabled 属性1 using (NorthwindDataContext context = new NorthwindDataContext())2 {3 context.ObjectTrackingEnabled = false;4 }关闭这个属性会使linq to sql 停止对对象的标识管理和变化跟踪。

但值得注意的是关闭ObjectTrackingEnabled 意味着也将DeferredLoadingEnabled 属性设置为false ,当访问相关表时会返回null 。

2. 不要把所有的数据对象都拖到一个DataContext 中一个DataContext 代表一个工作单元,并非整个数据库。

如果几个数据库对象之间没有关系,或者在程序中用不到的数据库对象(例如日志表,批量操作表等等),让这些对象消耗内存空间和DataContext 对象跟踪服务是完全没有必要的。

建议将所有的数据库对象按工作单元分给几个DataContext 来处理。

你也可以通过构造函数配置这些DataContext 使用相同的数据库连接,这样也可以发挥据库连接池的用途。

3. CompiledQuery --- 有必要就得用在创建一个linq to sql 表达式并将它转换成对应的sql 语句执行的过程,需要几个关键的步骤1) 创建表达式树2) 转换成sql3) 运行sql 语句4) 取回数据5) 将数据转换成对象很显然,当我们一遍又一遍的执行相同的查询时,上面1),2)两个步骤重复执行是在浪费时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这里总结了这些技巧。

我会介绍如何使用LINQ来:
?初始化数组
?在一个循环中遍历多个数组
?生成随机序列
?生成字符串
?转换序列或集合
?把值转换为长度为1的序列
?遍历序列的所有子集
如果你在LINQ方面有心得也欢迎在评论中一起分享。

1. 初始化数组
通常,我们需要把数组的值初始化为相同的值或递增的序列值,或者可能是一个步进不为1的递增/递减序列。

有了LINQ,我们可以在数组的初始化器中完成所有工作,不再需要循环!在如下的示例代码中,第一行代码初始化了一个长度为10的数组,所有元素都是-1,第二行代码初始化b为0、1、2到9,第三行代码初始化c为100、110、120到190.
int[] a = Enumerable.Repeat(-1, 10).ToArray();
int[] b = Enumerable.Range(0, 10).ToArray();
int[] c = Enumerable.Range(0, 10).Select(i => 100 + 10 * i).ToArray();
要提醒一下:如果你初始化一个很大的数组,最好不考虑这种优雅的方式而是使用传统的方式来替代。

LINQ的这种解决方案会动态产生数组,因此垃圾数组需要在运行时被回收。

也就是说,我总是会在小数组或测试调试代码的情况下使用这种技巧。

2. 在一个循环中遍历多个数组
有个朋友问我一个C#的问题:有没有办法在一个循环中遍历多个集合?他的代码差不多是这样:
foreach (var x in array1) {
DoSomething(x);
}
foreach (var x in array2) {
DoSomething(x);
}
这样的话,循环主体会很大,而且他也不希望这样重复的代码。

但是,他又不希望创建一个数组来保存array1和array2的所有元素。

LINQ提供了一种优雅的解决方案:Concat操作。

我们可以使用单个循环来重写上面的代码,如下:
foreach (var x in array1.Concat(array2)) {
DoSomething(x);
}
注意,由于LINQ在枚举器级别进行操作,他不会产生新的数组来保存array1和array2的元素。

因此,除了优雅之外,这个方案还很高效。

3. 生成随机序列
这是一个生成N长度随机序列的简单技巧:
Random rand = new Random();
var randomSeq = Enumerable.Repeat(0, N).Select(i => rand.Next());
有了LINQ的延迟特性,序列不会实现进行计算并保存到数组中,而是在迭代randomSeq 的时候按需生成随机数。

4. 生成字符串
LINQ同样也是生成各种类型字符串的好工具。

对于测试或调试,生成字符串时很有用的。

假设我们需要生成一个N长度的字符串,按照“ABCABCABC”的方式。

使用LINQ,解决方案非常优雅:
string str = new string(
Enumerable.Range(0, N)
.Select(i => (char)(…A‟ + i % 3))
.ToArray());
Petar Petrov给出了另外一种有趣的方式使用LINQ来生成字符串:
string values = string.Join(string.Empty, Enumerable.Repeat(pattern, N).ToArray());
5. 转换序列或集合
在C#或VB中我们不能实现把序列从T类型转换为U类型,即使T从U类继承。

因此,即使把List<string>转换为List<object>也很难实现。

(要解释为什么,请看Bick Byer的帖子)。

但是如果要把IEnumerable<T>转换为IEnumerable<U>的话,LINQ有一个简单而有效的解决方案:
IEnumerable<string> strEnumerable = …;
IEnumerable<object> objEnumerable = strEnumerable.Cast<object>();
如果我们需要转换List<T>为List<U>,LINQ也提供了解决方案,但是它会进行列表的复制:
List<string> strList = …;
List<object> objList = new List<object>(strList.Cast<object>());
Chris Cavanagh建议另外一种解决方式:
var objList = strList.Cast<object>().ToList();
6. 把值转换为长度为1的序列
当我们需要把单个值转化为一个长度为1的序列时,会怎么做?我们可以创建一个长度为1的数组,但是我还是喜欢LINQ的Repeat操作:
IEnumerable<int> seq = Enumerable.Repeat(myValue, 1);
7. 遍历序列的所有子集
有的时候,遍历数组的所有子集很有用。

子集和问题、布尔可满足性问题以及背包问题都可以通过遍历某个序列的所有子集来简单解决。

有了LINQ,我们可以如下声场所有arr数组的子集:
T[] arr = ...;
var subsets = from m in Enumerable.Range(0, 1 << arr.Length)
select
from i in Enumerable.Range(0, arr.Length)
where (m & (1 << i)) != 0
select arr[i];
注意,如果子集的个数超过了int,上面的代码就不能工作。

因此,仅当你知道arr的长度不超过30的时候才去使用这个方式。

如果arr长度超过30,你应该不会是想去遍历所有的子集,因为可能这会耗费几分钟或更长的时间。

评论和总结
希望这些技巧对你有用,这些示例代码都使用C#实现,但是你可以很容易得改变为其它.NET语言。

然而,LINQ对于支持扩展方法、lambda表达式和类型推断的。

相关文档
最新文档