首页 > 代码库 > C# LINQ(10)

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 返回始终重复一直的集合。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

筛选

 

C# LINQ(10)