一.Var关键字api
在学习Linq查询以前,咱们先来学习var关键字的用法,看看微软官方的定义:从Visual C#3.0开始,在方法范围声明的变量能够具备隐式“类型” var
。隐式类型的局部变量是强类型的,就像您本身声明了类型同样,但编译器肯定了类型。从这个定义咱们有两点须要注意,首先用var申明的隐式类型的局部变量是强类型的,二.var的推断类型是在编译的时候肯定的,不是在运行的时候。app
再看看微软官方给出的两个例子:学习
// Example #1: var is optional when // the select clause specifies a string string[] words = { "apple", "strawberry", "grape", "peach", "banana" }; var wordQuery = from word in words where word[0] == 'g' select word; // Because each element in the sequence is a string, // not an anonymous type, var is optional here also. foreach (string s in wordQuery) { Console.WriteLine(s); }
var
容许使用但不是必需的,由于查询结果的类型能够明确地表示为IEnumerable<string>
ui
// Example #2: var is required because // the select clause specifies an anonymous type var custQuery = from cust in customers where cust.City == "Phoenix" select new { cust.Name, cust.Phone }; // var must be used because each item // in the sequence is an anonymous type foreach (var item in custQuery) { Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone); }
var
容许结果是匿名类型的集合,除了编译器自己以外,不能访问该类型的名称。使用var
消除了为结果建立新类的要求。spa
在第二个例子中假如不用var关键字的话咱们就要事先建立好类,查询条件一变,查询结果就跟着改变,又要定义新的类型,linq查询的条件是随意变化的,不可能条件一变就声明新的类型,因此var关键字对linq查询相当重要的。code
二.匿名类对象
建立一个对象必定要先定义这个对象的类型么,固然不是,咱们能够经过匿名类的方式来建立对象,看看下面这段代码:blog
static void Main(string[] args) { string name = "Tom"; int age = 20; var obj = new { name,age }; Console.WriteLine(obj.age.ToString() + obj.name.ToString()); Console.Read(); }
三.Linq查询接口
Linq查询实质是操做集合的一系列扩展方法,Linq特性的核心接口是IEnumerable,只有实现了IEnumerable接口的集合才能够用Linq查询。ci
Linq的查询包含三种方法:
1.使用语法查询,这种查询方式和SQL语句比较像:
// Query #1. List<int> objInt = new List<int> { 1, 2, 5, 4, 3, 9, 7, 6, 11, 29, 99 }; var result = from i in objInt where i > 3 && i < 20 orderby i descending select i; foreach (var item in result) { Console.WriteLine(item.ToString()); } Console.Read(); // Query #2. List<string> objListString = new List<string> { "abc", "acd", "bcv", "bcd", "cnh", "ckl", "glk" }; var strResult = from str in objListString group str by str[0]; foreach (var item in strResult) { foreach (var item1 in item) { Console.WriteLine(item1); } } Console.Read(); }
2.使用扩展方法查询:
某些方法查询必须表现为方法调用,最多见的此类方法是可返回单一数值的方法,例如 Sum、Max、Min、Average 等。 这些方法在任何查询中都必须始终最后一个调用,由于它们只表示单个值,不能用做其余查询操做的源。
扩展方法select的使用:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums.Select(item => item * item); foreach (int item in list) { Console.WriteLine(item); } Console.ReadLine(); }
扩展方法Where的使用:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums .Where(item => item % 2 == 0) .Select(i => i * i); Console.ReadLine(); }
扩展方法orderby的用法:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums .Where(item => item % 2 == 0) .Select(i => i * i) .OrderBy(item => item); foreach (int i in list) { Console.WriteLine(i); } Console.ReadLine(); }
static void Main(string[] args)
{
string[] nums = { "张勇", "王琦", "刘静", "赵鑫鑫",
"杜丽", "马俊才", "那英", "成龙", };
var list = nums
.Where(item => item.Length == 2)
.Select(item => item)
.OrderByDescending(item => item.Substring(0, 1));
foreach (string item in list)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
3.结合使用查询语法和方法语法:
int numCount1 = (from num in numbers1 where num < 3 || num > 7 select num).Count();
因为查询 返回单个值而不是集合,所以查询当即执行。