LINQ概述:
LINQ引入了标准的、易于学习的、查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据储存。
var:
在LINQ查询表达式中,使用匿名类型初始化变量时就会用到它,由于只有编译器知道匿名类型的名称,因此必须在源代码中使用var。如果已经使用了var初始化查询变量,则还必须使用var作为查询变量进行循环访问的foreach语句中迭代变量的类型。
Lambda表达式:
Lambda表达式是一个匿名函数,包含表达式和语句,可用于创建委托或表达式目录树类型。所有Lambda表达式都使用Lambda运算符“=>”,(读为goes to)。Lambda运算符的左边是输入参数(如男有),右边包含表达式或语句块。例如,Lambda表达式x=x*x读作xgoes to x times x。
Lambda表达式的基本形式如下:
(input parameters) => expression
其中,input parameters表示输入参数,expression表示表达式。
LINQ查询表达式:
子 句 | 说 明 |
from | 指定数据源和范围变量 |
select | 指定执行查询时返回的序列中的元素将具有的类型和形式 |
group | 按照指定的键值对查询结果进行分组 |
where | 根据一个或多个由逻辑“与”和逻辑“或”运算符(&&或||)分隔的布尔表达式筛选元素。 |
orderby | 基于元素类型的默认比较器按升序或降序对查询结果进行排序 |
join | 基于两个指定匹配条件之间的相等比较来连接两个数据源 |
let | 引入一个用于储存查询表达式中子表达式结果的范围变量 |
into | 提供一个标识符,它可以充当对join、group或select子句的结果的引用 |
代码实现:
先定义一个功夫类和武林高手类,在主函数使用LINQ查询
internal class KongFu
{
public int Id { get; set; }
public string Name { get; set; }
public int Power { get; set; }
public override string ToString()
{
return string.Format("Id:{0},Name:{1},Power:{2},", Id, Name, Power);
}
}
internal class MartialArtsMaster
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string MenPai { get; set; }
public string KongFu { get; set; }
public int Level { get; set; }
public override string ToString()
{
return string.Format("Id:{0},Name:{1},Age:{2},MenPai:{3},KongFu:{4},Level:{5}", Id, Name, Age, MenPai, KongFu, Level);
}
}
internal class Program
{
static void Main(string[] args)
{
//var masterList = new List<MartialArtsMaster>()
//{
// new MartialArtsMaster(){Id = 100,Age = 22,KongFu = "寒冰掌"}
//};
//初始化武林高手
var aList = new List<int>(){1,2,3};
int a = aList.Count();
var masterList = new List<MartialArtsMaster>()
{
new MartialArtsMaster(){ Id = 1, Name = "黄蓉", Age = 18, MenPai = "丐帮", KongFu = "打狗棒法", Level = 9 },
new MartialArtsMaster(){ Id = 2, Name = "洪七公", Age = 70, MenPai = "丐帮", KongFu = "打狗棒法", Level = 10 },
new MartialArtsMaster(){ Id = 3, Name = "郭靖", Age = 22, MenPai = "丐帮", KongFu = "降龙十八掌",Level = 10 },
new MartialArtsMaster(){ Id = 4, Name = "任我行", Age = 50, MenPai = "明教", KongFu = "葵花宝典", Level = 1 },
new MartialArtsMaster(){ Id = 5, Name = "东方不败",Age = 35, MenPai = "明教", KongFu = "葵花宝典", Level = 10 },
new MartialArtsMaster(){ Id = 6, Name = "林平之", Age = 23, MenPai = "华山", KongFu = "葵花宝典", Level = 7 },
new MartialArtsMaster(){ Id = 7, Name = "岳不群", Age = 50, MenPai = "华山", KongFu = "葵花宝典", Level = 8 },
new MartialArtsMaster(){ Id = 8, Name = "令狐冲", Age = 23, MenPai = "华山", KongFu = "独孤九剑", Level = 10 },
new MartialArtsMaster(){ Id = 9, Name = "梅超风", Age = 23, MenPai = "桃花岛", KongFu = "九阴真经", Level = 8 },
new MartialArtsMaster(){ Id =10, Name = "黄药师", Age = 23, MenPai = "梅花岛", KongFu = "弹指神通", Level = 10 },
new MartialArtsMaster(){ Id = 11, Name = "风清扬", Age = 23, MenPai = "华山", KongFu = "独孤九剑", Level = 10 }
};
//初始化武学
var kongFuList = new List<KongFu>()
{
new KongFu(){Id=1, Name="打狗棒法", Power=90},
new KongFu(){Id=2, Name="降龙十八掌", Power=95},
new KongFu(){Id=3, Name="葵花宝典", Power=100},
new KongFu(){ Id= 4, Name = "独孤九剑", Power = 100 },
new KongFu(){ Id = 5, Name = "九阴真经", Power = 100 },
new KongFu(){ Id = 6, Name = "弹指神通", Power = 100 }
};
//linq语句查询
//var res = from m in masterList//from后设置查询对象
// where m.Level>8//where后跟查询条件
// select m;//返回结果
//扩展语法
//var res = masterList.Where(Test);
//linq联合查询
//var res = from m in masterList
// from k in kongFuList
// where m.KongFu == k.Name
// select new { master = m, kongFu = k };
var res = masterList.SelectMany(m => kongFuList, (m, k) => new { master = m, kongFu = k })
.Where(x => x.master.KongFu == x.kongFu.Name&&x.kongFu.Power>90);
//var res = masterList.Where(master=> master.Level > 8 && master.MenPai == "丐帮");
int b = res.Count();
Console.WriteLine(a);
Console.WriteLine(b);
foreach (var m in res)
{
Console.WriteLine(m);
}
//Console.WriteLine(res.Getlength(0));
}
static bool Test(MartialArtsMaster master)
{
if(master.Level>8&&master.MenPai=="丐帮")
{
return true;
}
else
{
return false;
}
}
}
结果: