LINQ 代表语言集成查询(language Integrated Query)可与数组、集合、XML、ADO.NET dataset使用
一、补充Lambda:“=>”运算符右边的表达式对运算符左边指定的参数执行操作,表达式的结果成为“=>”运算符的结果并返回。
1.Lambda表达式:
delegate int Incr(int v);
delegate bool IsEven(int v);
Incr incr = count => count + 2;
int x = incr(3); //输出5
IsEven isEven = n => n % 2 == 0;
isEven(2); //如果n为偶数返回true,为奇数返回false
2.Lambda语句:主题包括在大括号中,可以使用循环、if语句、声明变量
delegate int IntOp(int end);
delegate string StrMod(string s);
IntOp intOp = n => {
int r = 2;
for(int i =1; i <= n; i++)
r = i * r;
return r;
};
int x = intOp(2); // 返回4
StrMod strModReplace = s => {
return s.Replace(' ', '-');
};
string y = strModReplace("This is a test.");
二、LINQ 普通查询:
int[] nums = {1,2,3,6,7,16,-3,-6};
var posNums = from n in nums
where n > 0 && n < 10
select n;
foreach(int i in posNums) Console.write(i + " ");//输出1,2,3,6,7
三、LINQ orderby查询:
var posNums = from n in nums
orderby n desc
select n;
foreach(int i in posNums) Console.write(i + " ");//输出16,7......-6
四、LINQ select深入:
public string Name{get;set;}
public string Address{get;set;}
public EmailAddress(string n ,string a)
{
Name = n;
Address = a;
}
EmailAddress[] addrs = {
new EmailAddress("liu","liu.com"),
new EmailAddress("zhang","zhang.com"),
new EmailAddress("wang","wang.com")
}
var eAddrs = from entry in addrs
select entry.Address;
foreach(string s in eAddrs) Console.write(s + " ");//输出liu.com zhang.comwang.com
五、LINQ from嵌套:
class ChrPair{
public char First;
public char Second;
public ChrPair(char c,char c2)
{
First = c;
Second = c2;
}
}
char[] chrs = {'A','B','C'};
char[] chrs2 = {'X','Y','Z'};
var pairs = from ch1 in chrs
from ch2 in chrs2
select new ChrPair(ch1,ch2);
foreach(var p in pairs) Console.write("{0}{1}",p.First,P.Second + "-");
输出:AX-AY-AZ-BX-BY-BZ-CX-CY-CZ
六、LINQ group by:
LINQ join:
class Item{
public string Name{get;set;}
public bool ItemNumber{get;set;}
public Item(string n ,bool b){
Name = n;
ItemNumber = b;
}
}
class Item2{
public string Name2{get;set;}
public bool ItemNumber2{get;set;}
public Item2(string n ,bool b){
Name2 = n;
ItemNumber2 = b;
}
}
class Temp{
public string Name{get;set;}
public bool InStock{get;set;}
public Temp(string n ,bool b){
Name = n;
InStock = b;
}
}
Item[] items = {
new Item("a",true),
new Item("b",false),
new Item("c",false)
}
Item2[] items2 = {
new Item("e",true),
new Item("f",false),
new Item("g",true)
}
var list = from item in items
join entry in items2
on item.ItemNumber equals entry.ItemNumber
select new Temp(item.Name,entry.InStock);
foreach(Temp t in list)
{
Console.write("{0}\t{1}",t.Name,t.InStock);
}
输出:a true
b,false
七、LINQ 匿名类型:没有名称的类,用于创建select子句返回的对象
class Item{
public string Name{get;set;}
public bool ItemNumber{get;set;}
public Item(string n ,bool b){
Name = n;
ItemNumber = b;
}
}
class Item2{
public string Name2{get;set;}
public bool ItemNumber2{get;set;}
public Item2(string n ,bool b){
Name2 = n;
ItemNumber2 = b;
}
}
/*class Temp{
public string Name{get;set;}
public bool InStock{get;set;}
public Temp(string n ,bool b){
Name = n;
InStock = b;
}
}*/
Item[] items = {
new Item("a",true),
new Item("b",false),
new Item("c",false)
}
Item2[] items2 = {
new Item("e",true),
new Item("f",false),
new Item("g",true)
}
var list = from item in items
join entry in items2
on item.ItemNumber equals entry.ItemNumber
select new (Name = item.Name,InStock = entry.InStock); //匿名类
foreach(Temp t in list)
{
Console.write("{0}\t{1}",t.Name,t.InStock);
}
输出:a true
b,false
八、LINQ Lambda表达式:
int[] nums = {1,2,3,6,7,16,-3,-6};
var posNums = nums.Where(n => n > 0).Select( r => r);
foreach(int i in posNums) Console.write(i + " ");//输出1,2,3,6,7
//var posNums = nums.Where(n => n > 0).Select( r => r);这行代码创建了一个名为posNames的查询,改查询通过使用Where()方法(用于筛选值)和Select()方法(用于选择值)创建nums数组中的正数值。可以对nums数组调用Where()方法是应为所有数组都实现了IEnumerable<T>接口,IEnumerable<T>接口支持查询扩展方法。