首页 > 代码库 > 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)