主要的查询操作方法
Family |
Query operators |
Filtering |
OfType、Where |
Projection |
Select、SelectMany |
Partitioning |
Skip、SkipWhile、Take、TakeWhile |
Join |
GroupJoin、Join |
Concatenation |
Concat |
Ordering |
OrderBy、OrderByDescending、Reverse、ThenBy、ThenByDescending |
Grouping |
GroupBy、ToLookup |
Set |
Distinct、Except、Intersect、Union |
Conversion |
AsEnumerable、AsQueryable、Cast、ToArray、ToDictionary、ToList |
Equality |
SequenceEqual |
Element |
ElementAt、ElementOrDefault、First、FirstOrDefault、Last、LastOrDefault、Single、SingleOrDefault |
Generation |
DefaultIfEmpty、Empty、Range、Repeat |
Quantifiers |
All、Any、Contains |
Aggregation |
Aggregate、Average、Count、LongCount、Max、Min、Sum |
筛选指将结果集限制为只包含那些满足指定条件的元素的操作,下面的示例使用Where子句来从数组中筛选那些具有特定长度的字符串。
string[] words = { "the", "quick", "brown", "fox", "jumps" };
IEnumerable<string> query = from word in words
where word.Length == 3
select word;
投影是指将对象转换为一种新形式的操作,该操作通常值包含那些随后将要使用的属性。通过使用投影,可以构建依据每个对象生成的新类型。你可以映射属性,并对该属性执行数学函数。还可以在不更改原始对象的情况下映射该对象,下面的示例中的Select子句来映射字符串列表中的每个字符串的第一个字母。
List<string> words = new List<string>() { "an", "apple", "a", "day" };
var query = from word in words
select word.Substring(0, 1);
SelectMany,下面的示例中使用多个from子句或from子句来映射字符串列表中每个字符串中的每个单词。
List<string> phrases = new List<string>() { "an apple a day", "the quick brown fox" };
var query = from phrase in phrases
from word in phrase.Split(' ')
select word;
Select与SelectMany的比较:
LINQ中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中的一部分的操作。
运算符名称 |
说明 |
Skip |
跳过序列中指定位置之前的元素 |
SkipWhile |
基于谓词函数跳过元素,知道某元素不在满足条件 |
Take |
提取序列中指定位置之前的元素 |
TakeWhile |
基于谓词函数提取元素,直到某元素不在满足条件 |
下面的代码示例中使用Skip子句来跳过字符串数组中的前四个字符串,然后返回此数组中剩余的字符串
string[] words = { "an", "apple", "a", "day", "keeps", "the", "doctor", "away" };
var query = words.Skip(4);
下面的代码示例中使用SkipWhile子句来跳过数组中字符串的首字母为”a”的字符串。返回此数组中的剩余字符串
string[] words = { "an", "apple", "a", "day", "keeps", "the", "doctor", "away" };
var query = words.SkipWhile(u => u.Substring(0, 1) == "a");
下面示例使用Take子句来返回字符串数组中的前两个字符串
string[] words = { "an", "apple", "a", "day", "keeps", "the", "doctor", "away" };
var query = words.Take(2);
下面示例中使用TakeWhile子句来返回数组中的字符串长度小于或等于5的字符串
string[] words = { "an", "apple", "a", "day", "keeps", "the", "doctor", "away" };
var query = words.TakeWhile(u => u.Length < 6);
方法名 |
说明 |
查询表达式语法 |
GroupBy |
对共享公共属性的元素进行分组。每个组都有一个IGrouping<TKey,TElement>对象表示 |
Group……by 或 Group……by……into |
ToLookup |
根据键选择器函数将元素插入到Lookup<Tkey,TElement>中 |
|
GroupBy:
输出结果:
Lookup<TKey,TElement>表示映射到一个或多个值得各个键的集合
Lookup<TKey,TElement>类似于Dictionary<TKey,TValue>。不同之处在于:Dictionary<TKey,TValue>将各个键映射到单个值,而Lookup<TKey,TElement>将各个键映射到值得集合。
输出结果:
LINQ中的Set操作是指根据相同或不同集合中是否存在等效元素来生成结果集的查询操作
方法名 |
说明 |
Distinct |
从集合移除重复值 |
Except |
返回差集,差集是指位于一个集合单步位于另外一个集合的元素 |
Intersect |
返回交集 |
Union |
返回并集 |
元素操作从一个序列返回单个特定元素
方法名 |
说明 |
ElementAt |
返回集合中指定索引处得元素 |
ElementAtOrDefault |
返回集合中指定索引处得元素;如果超出范围,则返回默认值 |
First |
返回集合中的第一个元素或满足条件的第一个元素 |
FirstOrDefault |
返回集合中的第一个元素或满足条件的第一个元素。如果没有这样的元素,则返回默认值 |
Last |
返回集合中的最后一个元素或满足条件的最后一个元素 |
LastOrDefault |
返回集合中的最后一个元素或满足条件的最后一个元素。如果没有这样的元素,则返回默认值 |
Single |
返回集合中的唯一元素或满足条件的唯一元素 |
SingleOrDefault |
返回集合中的唯一元素或满足条件的唯一元素。如果没有这样的元素或集合不是正好包含一个元素,则返回默认值 |
方法名 |
说明 |
Aggregate |
对集合值执行自定义聚合运算 |
Average |
计算值集合的平均值 |
Count |
对集合中的元素进行计数,还可以仅满足某一谓词函数的元素进行计数 |
Longcount |
对大型集合中的元素进行计数,还可以仅满足某一谓词的元素进行计数 |
Max |
确定集合的最大值 |
Min |
确定集合中的最小值 |
Sum |
计算集合中值得总和 |
Aggregate:
输出结果:
Concat:
方法名 |
说明 |
AsEnumerable |
返回类型为IEnumerable<T>的输入 |
AsQueryable |
将IEnumerable转换为(泛型)IQueryable |
Cast |
将集合的元素强制转换为指定的类型 |
OfType |
根据值强制转换为指定类型的能力筛选值 |
ToArray |
|
ToDictionary |
|
ToList |
|
ToLookUp |
|
备注:此文参考了MSDN