序
一、按标准执行方式分类
二、排列数据
| 方法名 | 说明 | C# 查询表达式语法 |
| OrderBy | 按升序对值进行排序。 | orderby |
| OrderByDescending | 按降序对值进行排序。 | orderby … descending |
| ThenBy | 按升序执行次要排序。 | orderby …, … |
| ThenByDescending | 按降序执行次要排序。 | orderby …, … descending |
| Reverse | 颠倒集合中的元素的顺序。 | X |
示例:
1 var words = new[] { "the", "quick", "brown", "fox", "jumps" }; 2 var query = from word in words 3 orderby word.Length 4 select word; 5 6 foreach (var word in query) 7 { 8 Console.WriteLine(word); 9 }
1 var words = new[] { "the", "quick", "brown", "fox", "jumps" }; 2 var query = from word in words 3 orderby word.Substring(0,1) descending 4 select word; 5 6 foreach (var word in query) 7 { 8 Console.WriteLine(word); 9 }
1 var words = new[] { "the", "quick", "brown", "fox", "jumps" }; 2 var query = from word in words 3 orderby word.Length, word.Substring(0, 1) 4 select word; 5 6 foreach (var word in query) 7 { 8 Console.WriteLine(word); 9 }
1 var words = new[] { "the", "quick", "brown", "fox", "jumps" }; 2 var query = from word in words 3 orderby word.Length, word.Substring(0, 1) descending 4 select word; 5 6 foreach (var word in query) 7 { 8 Console.WriteLine(word); 9 }
三、Set 操作
LINQ 中的 Set 操作是指根据相同或不同集合中是否存在等效元素来生成结果集的查询操作。
| 方法名 | 说明 |
C# 查询表达式语法 |
|
Distinct |
从集合移除重复值。 |
X |
|
Except |
返回差集,差集是指位于一个集合但不位于另一个集合的元素。 |
X |
|
Intersect |
返回交集,交集是指同时出现在两个集合中的元素。 |
X |
|
Union |
返回并集,并集是指位于两个集合中任一集合的唯一的元素。 |
X |
图解 Set 操作
(1)Distinct: 返回的序列包含输入序列的唯一元素。
(2)Except: 返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。
(3)Intersect: 返回的序列包含两个输入序列共有的元素。
四、过滤数据
| 方法名 | 说明 | C# 查询表达式语法 |
| OfType | 根据值强制转换为指定类型的能力选择值。 | X |
| Where | 选择基于谓词函数的值。 | where |
1 string[] words = { "the", "quick", "brown", "fox", "jumps" }; 2 3 var query = from word in words 4 where word.Length == 3 5 select word; 6 7 foreach (var word in query) 8 { 9 Console.WriteLine(word); 10 }
五、量词操作
限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。
|
方法名 |
说明 |
C# 查询表达式语法 |
| All |
确定是否序列中的所有元素都满足条件。 |
X |
| Any |
确定序列中是否有元素满足条件。 |
X |
|
Contains |
确定序列是否包含指定的元素。 |
X |
六、投影操作
| 方法名 | 说明 | C# 查询表达式语法 |
| Select | 映射基于转换函数的值。 | select |
| SelectMany | 映射基于转换函数的值序列,然后将它们展平为一个序列。 | from 子句 |
1 var words = new[] { "the", "quick", "brown", "fox", "jumps" }; 2 var query = from word in words 3 select word.Substring(0,1); 4 5 foreach (var word in query) 6 { 7 Console.WriteLine(word); 8 }
1 var phrases = new List<string>() { "an apple a day", "the quick brown fox" }; 2 3 var query = from phrase in phrases 4 from word in phrase.Split(' ') 5 select word; 6 7 foreach (var word in query) 8 { 9 Console.WriteLine(word); 10 }
Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值。Select() 为每个源值生成一个结果值。因此,总体结果是一个与源集合具有相同元素数目的集合。与之相反,SelectMany() 将生成单一总体结果,其中包含来自每个源值的串联子集合。作为参数传递到 SelectMany() 的转换函数必须为每个源值返回一个可枚举值序列。然后,SelectMany() 将串联这些可枚举序列以创建一个大的序列。
下面两个插图演示了这两个方法的操作之间的概念性区别。在每种情况下,假定选择器(转换)函数从每个源值中选择一个由花卉数据组成的数组。
下图描述 Select() 如何返回一个与源集合具有相同元素数目的集合。
下图描述 SelectMany() 如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。
示例
下面的示例比较 Select() 和 SelectMany() 的行为。代码将通过从源集合的每个花卉名称列表中提取前两项来创建一个“花束”。在此示例中,转换函数 Select 使用的“单一值”本身就是一个值集合。这需要额外的 foreach 循环,以便枚举每个子序列中的每个字符串。
1 static void Main(string[] args) 2 { 3 var bouquets = new List<Bouquet>() 4 { 5 new Bouquet {Flowers = new List<string> {"sunflower", "daisy", "daffodil", "larkspur"}}, 6 new Bouquet {Flowers = new List<string> {"tulip", "rose", "orchid"}}, 7 new Bouquet {Flowers = new List<string> {"gladiolis", "lily", "snapdragon", "aster", "protea"}}, 8 new Bouquet {Flowers = new List<string> {"larkspur", "lilac", "iris", "dahlia"}} 9 }; 10 11 IEnumerable<List<string>> query1 = bouquets.Select(bq => bq.Flowers); 12 IEnumerable<string> query2 = bouquets.SelectMany(bq => bq.Flowers); 13 14 Console.WriteLine("query1 - Select():"); 15 foreach (IEnumerable<string> collection in query1) 16 { 17 foreach (var item in collection) 18 { 19 Console.WriteLine(item); 20 } 21 } 22 23 Console.WriteLine("\nquery2 - SelectMany():"); 24 foreach (var item in query2) 25 { 26 Console.WriteLine(item); 27 } 28 29 Console.Read(); 30 } 31 32 class Bouquet 33 { 34 public List<string> Flowers { get; set; } 35 }