导图社区 ling 结构
linq 学习的具体方法和思路
编辑于2019-06-01 09:04:28linq
LINQ to Objects
System.Core.dll
提供对内存中集合操作的支持
LINQ to XML
System.Xml.Linq.dll
提供对XML数据源的操作的支持
LINQ to SQL
System.Data.Linq.dll
提供对Sql Server数据源操作的支持。(微软已宣布不再更新,推荐使用LINQ to Entities)
LINQ to DataSet
System.Data.DataSetExtensions.dll
提供对离线数据操作的支持。
LINQ to Entities
System.Core.dll 和 System.Data.Entity.dll
LINQ to Entities 是 Entity Framework 的一部分并且取代 LINQ to SQL 作为在数据库上使用 LINQ 的标准机制。(Entity Framework 是由微软发布的开源对象-关系映射(ORM)框架,支持多种数据库。)
操作符
过滤
where
根据返回bool值的Func委托参数过滤元素。
oftype
object[] data = { "one", 2, 3, "four", "five", 6 };var query = data.OfType<string>(); // "one", "four", "five"
接收一个非泛型的IEnumerable集合,根据OfType泛型类型参数过滤元素,只返回TResult类型的元素。
业务说明:过滤object数组中的元素,返回字符串类型的数组。
Distinct
删除序列中重复的元素。
投影
select
Select 将序列的每个元素经过lambda表达式处理后投影到一个新类型元素上。
selectMany
a) c#编译器会把“复合from子句”的查询表达式转换为SelectMany()扩展方法。
b) 将序列的每个元素经过lambda表达式处理后投影到一个 IEnumerable,再将多个IEnumerable序列合并为一个返回序列IEnumerable。
排序
// 查询表达式 var racers = from r in Formula1.GetChampions() orderby r.Country, r.LastName descending, r.FirstName select r;// 方法语法 var racers = Formula1.GetChampions() .OrderBy(r => r.Country) .ThenByDescending(r => r.LastName) .ThenBy(r => r.FirstName);
orderby
OrderbyDescending
thenby
thenbyDescending
Reverse
反转集合中所有元素的顺序。
连接
join
// 查询表达式var racersAndTeams = from r in racers join t in teams on r.Year equals t.Year select new { Year = r.Year, Racer = r.Name, Team = t.Name }; // 方法语法var racersAndTeams = racers.Join(teams , r => r.Year, t => t.Year , (r, t) => new { Year = r.Year, Racer = r.Name, Team = t.Name } );
in:基于匹配键对两个序列的元素进行关联。
join goup
基于键相等对两个序列的元素进行关联并对结果进行分组。常应用于返回“主键对象-外键对象集合”形式的查询。
分组
Group
// 查询表达式var countries = from r in Formula1.GetChampions() group r by r.Country into g select new { Country = g.Key, Racers = g };// 方法语法var countries = Formula1.GetChampions() .GroupBy(r => r.Country) .Select(g => new { Country = g.Key, Racer = g });
返回值为 IEnumerable<IGrouping<TKey, TSource>> ,根据指定的键选择器函数对序列中的元素进行分组。
group by
// 查询表达式 var racersAndTeams = from r in racers join t in teams on r.Year equals t.Year into groupTeams select new { Year = r.Year, Racer = r.Name, GroupTeams = groupTeams }; // 方法语法 var racersAndTeams = racers .GroupJoin(teams , r => r.Year, t => t.Year , (r, t) => new { Year = r.Year, Racer = r.Name, GroupTeams = t } );
回值为 IEnumerable,根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。
量词
all
确定序列中的所有元素是否满足条件。
any
确定序列是否包含任何元素;或确定序列中的任何元素是否都满足条件。
contains
确定序列是否包含指定的元素。
分区
skip
从序列的开头返回指定数量的连续元素。
Take
:跳过序列中指定数量的元素,然后返回剩余的元素。
sikipWhile
只要满足指定的条件,就会返回序列的元素
集合
union
:并集,返回两个序列的并集,去掉重复元素。
Contact
并集,返回两个序列的并集。
intersect
交集,返回两个序列中都有的元素,即交集。
except
差集,返回只出现在一个序列中的元素,即差集。
zip
string[] start = {"<html>","<head>","<body>" };string[] end = { "</html>", "</head>", "</body>" }; var tags = start.Zip(end, (s, e) => { return s + e; });foreach (string item in tags){ Console.WriteLine(item);}
通过使用指定的委托函数合并两个序列,集合的总个数不变。
SequnceEqual
判断两个序列是否相等,需要内容及顺序都相等。
元素
Single
返回序列的唯一元素;如果是空序列或序列包含多个元素,此方法将引发异常。
elementAtOfDefault
返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,则返回默认值default(TSource)。
elementAt
返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,此方法将引发异常。
last
返回序列的最后一个元素;如果是空序列,此方法将引发异常。
FirtOfDefault
返回序列中的第一个元素;如果是空序列,则返回默认值default(TSource)。
First
返回序列中的第一个元素;如果是空序列,此方法将引发异常。
singleOrDefault
返回序列中的唯一元素;如果是空序列,则返回默认值default(TSource);如果该序列包含多个元素,此方法将引发异常。
合计
Count
返回一个 System.Int32,表示序列中的元素的总数量。
LongCount
返回一个 System.Int64,表示序列中的元素的总数量。
Sum
计算序列中元素值的总和。
Max
返回序列中的最大值。
Min
返回序列中的最小值。
Average
计算序列的平均值。
Aggregate
int[] numbers = { 1, 2, 3 };// 1+2+3 = 6int y = numbers.Aggregate((prod, n) => prod + n);// 0+1+2+3 = 6int x = numbers.Aggregate(0, (prod, n) => prod + n);// (0+1+2+3)*2 = 12int z = numbers.Aggregate(0, (prod, n) => prod + n, r => r * 2);
对序列应用累加器函数。
Aggregate的第一个参数是算法的种子,即初始值。第二个参数是一个表达式,用来对每个元素进行计算(委托第一个参数是累加变量,第二个参数当前项)。第三个参数是一个表达式,用来对最终结果进行数据转换。
转换
Cast
将非泛型的 IEnumerable 集合元素转换为指定的泛型类型,若类型转换失败则抛出异常。
ToArray
从 IEnumerable<T> 创建一个数组。
tolist
从 IEnumerable<T> 创建一个 List<T>。
toDictionary
根据指定的键选择器函数,从 IEnumerable<T> 创建一个 Dictionary<TKey,TValue>。
toLookup
ILookup<string, Racer> racers = (from r in Formula1.GetChampions() from c in r.Cars select new { Car = c, Racer = r } ).ToLookup(cr => cr.Car, cr => cr.Racer);
根据指定的键选择器函数,从 IEnumerable<T> 创建一个 System.Linq.Lookup<TKey,TElement>。
Lookup类似于Dictionary,不过,Dictionary每个键只对应一个值,而Lookup则是1:n 的映射。Lookup没有公共构造函数,而且是不可变的。在创建Lookup之后,不能添加或删除其中的元素或键。(可以将ToLookup 视为GroupBy与ToDictionary的功能合体)
As Enumerable
用于处理LINQ to Entities操作远程数据源
IQueryable远程数据立即转化为本地的IEnumerable集合
DefaultIfEmpty
返回指定序列的元素;如果序列为空,则返回包含类型参数的默认值的单一元素集合。
生成
Range
生成指定范围内的整数的序列 IEnumerable<Int32>。
Empty
生成一个具有指定类型参数的空序列 IEnumerable<T>。
Repeat
生成包含一个重复值的序列 IEnumerable<T>。
立即执行
延迟执行