首页 > 代码库 > LINQ 101——约束、投影、排序

LINQ 101——约束、投影、排序

什么是LINQ:LINQ 是一组 .NET Framework 扩展模块集合,内含语言集成查询、集合以及转换操作。它使用查询的本机语言语法来扩展 C# 和 Visual Basic,并提供利用这些功能的类库。

什么是LINQ 101:是学习LINQ的不错的资源(下载地址:http://pan.baidu.com/s/1ntE74NJ),当初我也是看LINQ101来熟悉LINQ的。现把我当时的学习笔记整理出来

Restriction (约束)
Projection (投影)
Ordering (排序)
Partitioning (分区)
Join
Aggregate(聚合)
Grouping(分组)
Set(集合)
Conversion(转换)
Element(元素操作)

本篇文章介绍前三个

1. 约束 ——where

var query = from item in [集合] where [item满足的条件] select item;

int[] numbers = { 5, 4, 3, 7, 9, -12 };var query = from n in numbers            where n % 3 == 0            select n;Console.WriteLine("被3整除的数:");foreach (var num in numbers){    Console.WriteLine(num);}
View Code

2. 投影——select

例1:让数组中每个数都加1

 1 int[] numbers = { 5, 4, 1, 3, 9, 8,-13 }; 2  3 var numsPlusOne = 4     from n in numbers 5     select n + 1; 6  7 Console.WriteLine("整数+1:"); 8 foreach (var num in numsPlusOne) 9 {10     Console.WriteLine(num);11 }
View Code

例2:选取某类中一个属性

 1 public class Config 2 { 3     public Guid ID { get; set; } 4     public string Name { get; set; } 5     public string Remark { get; set; } 6  7     Config() { } 8  9     public static List<Config> GetConfigs()10     {11         return new List<Config> 12         { 13             new Config{ ID=Guid.NewGuid(), Name="XX1号",Remark="Remark1号"},14             new Config{ ID=Guid.NewGuid(), Name="XX2号",Remark="Remark2号"},15             new Config{ ID=Guid.NewGuid(), Name="XX3号",Remark="Remark3号"}16         };17     }18 }19 20 21 static void Linq3()22 {23     var source = Config.GetConfigs();24     var query = from item in source25                 select item.Name;26     foreach (var c in query)27     {28         Console.WriteLine(c);29     }30 }
View Code

例3:数组下标转换

 1 static void Linq4() 2 { 3     int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 4     string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 5  6     var textNums = 7         from n in numbers 8         select strings[n]; 9 10     Console.WriteLine("数组下标转换");11     foreach (var s in textNums)12     {13         Console.WriteLine(s);14     }15 }
View Code

例3:匿名类型,大小写

 1 static void Linq5() 2 { 3     string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" }; 4     var query = from word in words 5                             select new { Upper = word.ToUpper(), Lower = word.ToLower() }; 6     foreach (var item in query) 7     { 8         Console.WriteLine("大写: {0} 小写: {1}",item.Upper,item.Lower); 9     }10 }
View Code

例4:将投影的属性放到一个类中

 1 public class Dto 2 { 3     public string Field1 { get; set; } 4     public string Field2 { get; set; } 5     public string Field3 { get; set; } 6 } 7  8 static void Linq6() 9 {10     var source = Config.GetConfigs();11     var query = from item in source12                 select new Dto { Field1 = item.ID.ToString(), Field2 = item.Name, Field3 = item.Remark };13     foreach (var item in query)14     {15         Console.WriteLine("{0} {1} {2}", item.Field1, item.Field2, item.Field3);16     }17 }
View Code

例5:筛选 加where条件参见 where 例1

例6:复合from子句(选取座机号码区号为021的客户信息)

 1 public class Guest 2 { 3     /// <summary> 4     /// 姓名 5     /// </summary> 6     public string Name { get; set; } 7  8     /// <summary> 9     /// 年龄10     /// </summary>11     public int Age { get; set; }12 13     /// <summary>14     /// 电话表15     /// </summary>16     public List<string> TelTable { get; set; }17 }18 19 20 static void Linq8()21 {22     var source = new List<Guest>23     {24         new Guest{ Name="张三",Age=21,TelTable=new List<string>{"010-123456","13000000"}},25         new Guest{ Name="李四",Age=22,TelTable=new List<string>{"021-123456","13100000"}},26         new Guest{ Name="王五",Age=23,TelTable=new List<string>{"022-123456","13200000"}}27     };28     // 找电话簿中是021区号的客户29     var query = from guest in source30                 from tel in guest.TelTable31                 where tel.Contains("021-")32                 select guest;33 34     foreach (var guest in query)35     {36         Console.WriteLine("{0} 年龄:{1}", guest.Name, guest.Age);37         foreach (var tel in guest.TelTable) { Console.WriteLine("     电话:{0}",tel); }38     }39 }
View Code

例7:多个 form 子句(交叉连接)

 1 static void Linq7() 2 { 3     int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 4     int[] numbersB = { 1, 3, 5, 7, 8 }; 5  6     var pairs = 7         from a in numbersA 8         from b in numbersB 9         where a < b10         select new { a, b };11 12     Console.WriteLine("交叉连接 a < b:");13     foreach (var pair in pairs)14     {15         Console.WriteLine("{0} 小于 {1}", pair.a, pair.b);16     }17 }
View Code

 

3.排序

orderby 排序字段

orderby 排序字段 descending

Thenby(orderby 多个排序字段)

ThenByDescending  (orderby 多个排序字段 descending)

例1:orderby 排序字段

 1 static void Linq9() 2 { 3     string[] words = { "cherry", "apple", "blueberry" }; 4  5     var sortedWords = 6         from w in words 7         orderby w 8         select w; 9 10     Console.WriteLine("单词排序 order by 单个排序字段:");11     foreach (var w in sortedWords)12     {13         Console.WriteLine(w);14     }15 }
View Code

例2:orderby 排序字段 descending

 1 static void Linq10() 2 { 3     string[] words = { "cherry", "apple", "blueberry" }; 4  5     var sortedWords = 6         from w in words 7         orderby w descending 8         select w; 9 10     Console.WriteLine("单词排序 order by 单个排序字段 从大到小:");11     foreach (var w in sortedWords)12     {13         Console.WriteLine(w);14     }15 }
View Code

例3:Thenby(orderby 多个排序字段)

 1 static void Linq11() 2 { 3     string[] words = { "cherry", "appppp", "cherryo", "appppppple", "blueberry" }; 4  5     // 先按名称排,再按长度排序 6     var sortedWords = 7         from w in words 8         orderby w,w.Length 9         select w;10 11     Console.WriteLine("单词排序 ThenBy 多个排序字段");12     foreach (var w in sortedWords)13     {14         Console.WriteLine(w);15     }16 }
View Code

例4:ThenByDescending  (orderby 多个排序字段 descending)

注意主要条件和次要的升降序不传递

 1 static void Linq12() 2         { 3             string[] words = { "cherry", "appppp", "cherryo", "appppppple", "blueberry" }; 4  5             // 先按名称排,再按长度排序 6             var sortedWords = 7                 from w in words 8                 orderby w descending, w.Length descending 9                 select w;10 11             Console.WriteLine("单词排序 ThenBy 多个排序字段");12             foreach (var w in sortedWords)13             {14                 Console.WriteLine(w);15             }16         }
View Code

 

 

本文代码: http://pan.baidu.com/s/1dDnJ0tV

LINQ 101——约束、投影、排序