C# LINQ(10)

LINQ 查询

var query = from r in Formula1.GetChampions()
    where r.Country == "Brazil"
    orderby r.Wins descending
    select r;

foreach (Racer racer in query)
{
    Console.WriteLine("{0:A}", racer);
}

扩展方法

LINQ为IEnumerable<T>接口提供各种扩展方法,以便用户实现了该接口的任意集合上使用LINQ查询。扩展方法在静态类中声明,定义一个静态方法,第一参数定义扩展的类型。

扩展方法可以将方法写入最初没有提供该方法的类中,可以把方法添加到实现某个特定接口的任何类中,这样多个类可以使用相同的实现代码。

class Program
{
    private static void Main(string[] args)
    {
        string s1 = "111111";
        s1.Function();

        string s2 = "2222222";
        s2.Function();
    }
}

public static class StringExtension
{
    public static void Function(this string s)
    {
        Console.WriteLine("this string is " + s);
    }
}

第一个参数 this 用来区分是扩展方法还是静态方法。

第二个参数 需要对应扩展的类。

注意 扩展方法里不能访问类型的私有成员。

还可以这样调用

StringExtension.Function(s1);

LINQ 扩展示例

var champions = new List<Racer>(Formula1.GetChampions());
IEnumerable<Racer> brazilChampions =
    champions.Where(r => r.Country == "Brazil").
            OrderByDescending(r => r.Wins).
            Select(r => r);

foreach (Racer r in brazilChampions)
{
  Console.WriteLine("{0:A}", r);
}

推迟查询的执行

var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };

var namesWithJ = from n in names
                 where n.StartsWith("J")
                 orderby n
                 select n;

Console.WriteLine("First iteration");
foreach (string name in namesWithJ)
{
  Console.WriteLine(name);
}
Console.WriteLine();

names.Add("John");
names.Add("Jim");
names.Add("Jack");
names.Add("Denny");

Console.WriteLine("Second iteration");
foreach (string name in namesWithJ)
{
  Console.WriteLine(name);
}

namesWithJ 一旦使用了ToArray、ToList之类的。就 names 了。如

var namesWithJ = (from n in names
                       where n.StartsWith("J")
                       orderby n
                       select n).ToList();

标准的查询操作

Enumberable 类定义的标准查询操作符。


标准查询操作符

说明

Where

OfType<TResult>


称为筛选操作符定义返回元素的条件。

Where     使用谓词,返回符合条件的元素。

OfType<TResult>  返回符合类型的元素。


Select

SelectMany


投射操作符用于把对象转换为另一个类型的新对象。

Select 和 SelectMany 定义根据选择器函数选择结果值的投射。


OrderBy

ThenBy

OrderByDescending

ThenByDescending

Reverse


排序操作符改变返回的元素的顺序。

Orderby 升序排序。

OrderBydescending  降序排序。

TheBy 和 ThenByDescending 二次排序。

Reverse 反转集合元素。


Join

GroupJoin


连接操作符。用于合并不直接相关的集合。

Join     根据键选择器函数连接两个集合。

GroupJoin   连接两个集合。


GroupBy

ToLookup


组合操作符把数据放在组中。

GroupBy   组合公共键的元素。

Tookup    创建一个一对多字典,组合元素。


Any

All

Contains


限定操作符,元素满足指定的条件。

Any 满足谓词函数的函数。

All  所有元素是否都满足谓词函数。

Contains   检查某个元素是否在集合中。


Take

Skip

TakeWhile

SkipWhile


分区操作符返回集合的子集。

Take 从集合提取元素个数。

Skip 跳过指定的元素个数,提取其他元素。

TakeWhile 提取条件为真的元素。


Distinct

Union

Intersect

Except

Zip


Set操作符返回一个集合。

Distinct 删除重复的元素。

Union 返回集合中唯一元素。

Intersect  返回两个集合都有的元素。

Except  只出现在一个集合中的元素。

Zip 两个集合合并为一个元素。


First

FirstOrDefault

Last

LastOrDefault

ElementAt

ElementAtOrDefault

Single

SingleOrDefault


元素操作符返回一个元素。

First                 返回第一个满足条件的元素。

FirstOrDefault  类似First,如果未找到满足条件元素,返回类型的默认值。

Last                 返回最后一个满足条件的元素。

ElementAt        返回元素的位置。

Single               返回一个满足条件的元素。如果有多个元素都满足条件,就抛出一个异常。


Count

Sum

Min

Max

Average

Aggregate


聚合操作符计算集合值。

Sum 总和。

Count  所有元素个数。

Min  最小元素。

Max  最大元素。

Average 平均值。

Aggregate  根据输入的表达式获取聚合值。


ToArray

AsEnumerable

ToList

ToDictionary

Cast<TResult>


转换操作符。


Empty

Range

Repeat


生成操作符。

Empty 空集合。

Range 返回一系列数字。

Repeat 返回始终重复一直的集合。

筛选

时间: 2024-11-09 02:20:29

C# LINQ(10)的相关文章

LINQ:开始使用 LINQ(五)- LINQ 中的查询语法和方法语法

开始使用 LINQ(五)- LINQ 中的查询语法和方法语法 在表示语言集成查询 (LINQ) 使用 LINQ 性查询语法,文档中的多数查询编写.但是,编译代码时,必须将查询语法转换为方法,这就需要 .NET 公共语言运行时 (CLR).这些方法调用标准查询运算符的名称类似 Where.Select.GroupBy.Join.Max和 Average.可以调用这些方法直接使用方法语法而不是查询语法. 查询语法和方法语法语义相同,但是,许多人员发现查询语法更简单.更易于阅读.某些查询必须表示为方法

LINQ:开始使用 LINQ(二)- 基本 LINQ 查询操作

开始使用 LINQ (二)- 基本 LINQ 查询操作 一.获取数据源:from 在 LINQ 查询中,第一步是指定数据源.像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它.在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 (customers) 和范围变量 (cust). 1 //queryAllCustomers 是 IEnumerable<Cutsomer> 类型 2 var queryAllCustomers = from cust in custom

LINQ:开始使用 LINQ(一)- 介绍 LINQ 查询

开始使用 LINQ (一)- 介绍 LINQ 查询 查询是一种从数据源检索数据的表达式. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据库的 SQL 和用于 XML 的 XQuery. 因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言. LINQ 通过提供一种跨数据源和数据格式使用数据的一致模型,简化了这一情况.在 LINQ 查询中,始终会用到对象.可以使用相同的编码模式来查询和转换 XML 文档.SQL 数据库.ADO.NET 数据集..N

LINQ:开始使用 LINQ(三)- 使用 LINQ 进行数据转换

开始使用 LINQ(三)- 使用 LINQ 进行数据转换 语言集成查询 (LINQ) 不仅可用于检索数据,  而且还是一个功能强大的数据转换工具.  通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以创建新的输出序列.您可以通过排序和分组来修改该序列,而不必修改元素本身.但是,LINQ 查询的最强大的功能是能够创建新类型.这一功能在 select 子句中实现. 例如,可以执行下列任务: 一. 将多个输入联接到一个输出序列 1 class Student 2 { 3 publ

Oracle系列:(10)小结

使用NVL(a,b)通用函数,统计员工年收入,NVL()作用于任何类型,即(number/varchar2/date) 通用函数:参数类型可以是number或varchar2或date类型 使用NVL2(a,b,c)通用函数,如果a不为NULL,取b值,否则取c值,统计员工年收入 使用NULLIF(a,b)通用函数,在类型一致的情况下,如果a与b相同,返回NULL,否则返回a,比较10和10.0是否相同 使用SQL99标准通用语法中的case表达式,将职位是分析员的,工资+1000:职位是经理的

varchar(10)与nvarchar(10)有什么区别

前者是非unicode型,存储字符按1个算(内部空间存储占1字节),存储汉字的话按2个算, 就是可以存10个字符或者5个汉字 后者是unicode型,存储什么都是按1个算(内部空间存储占2字节), 就是可以存10个字符或10个汉字 varchar(10)与nvarchar(10)就是分别占10个字节和20个字节

微软ASPNET站点部署指南(10):迁移至SQLServer(转载)

微软ASPNET站点部署指南(10):迁移至SQLServer 1.  综述 第2章的部署SQL Server Compact和第9章的部署数据库更新里解释了为什么最终要升级到完整版SQL Server .本章节将告诉你如何来做. SQL Server Express和完整版SQL Server 一旦你决定使用完整版SQL Server,你需要在开发和测试环境使用SQL Server Express 或者完整版SQL Server.在工具支持和数据库引擎功能上,SQL Server Compac

nova分析(10)—— nova-rootwrap

一.nova-rootwrap的作用 部署玩过openstack的都应该知道,它会生成一个nova用户来管理所有服务.nova身份在linux中属于普通用户级别,避免了一些需要root身份运行的操作,提高linux系统的安全性.但是openstack在实际过程中会调用很多外部命令,例如就network服务而言就有:`ip`,`ovs-vsctl`,`iptables`,`dnsmasq`,`brctl`等等,这些命令在linux中都是需要以root身份来运行的,如果是普通用户通常的做法是在命令前

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni