哈哈,隔了一个星期,再怎么样都要发一篇,要多看书啊,书不能停~~~
where子句的语法格式如下:where 过虑表达式
例子:新建一个珠宝类,如下:
1 class Jewellery 2 { 3 /// <summary> 4 /// 珠宝类型 5 /// <list type="Ring">戒指</list> 6 /// <list type="Necklace">项链</list> 7 /// <list type="Bracelet">手链</list> 8 /// </summary> 9 public enum JewelleryType10 {11 Ring,12 Necklace,13 Bracelet14 }15 /// <summary>16 /// 当前珠宝状态17 /// <list type="Stock">存货</list>18 /// <list type="Repair">修理中</list>19 /// <list type="Sold">已售出</list>20 /// </summary>21 public enum JewelleryState22 {23 Stock,24 Repair,25 Sold26 }27 public JewelleryType Type { get; set; }28 public double PRice { get; set; }29 public JewelleryState State { get; set; }30 }
再我们使用一个List来做容器,通过LINQ来过虑。
1 List<Jewellery> list = new List<Jewellery>() 2 { 3 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Repair,Price=100 }, 4 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=200 }, 5 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Stock,Price=300 }, 6 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=400 }, 7 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Stock,Price=500 }, 8 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Repair,Price=600 } 9 };10 11 //查找价格大于300的手链12 var result = from item in list13 where item.Price > 300 && item.Type == Jewellery.JewelleryType.Bracelet14 select item;15 //转换为list.Where(item => item.Price > 300).Where(item => item.Type == Jewellery.JewelleryType.Bracelet);16 Console.WriteLine(result.Count());17 18 //记录当前正在修理中的珠宝总值19 var result1 = (from item in list20 where item.State == Jewellery.JewelleryState.Repair21 select item).Sum(item => item.Price);22 //转换为list.Where(item => item.State == Jewellery.JewelleryState.Repair).Sum(item => item.Price);23 Console.WriteLine(result1);24 25 Console.ReadKey();
1 var resutl2 = from item in list2 select item;3 //这个就是所谓的退化表达式,编译器会故意生成一个对Select方法的调用,即使它什么都没有做,但result2和list有很大的不同,4 //两个序列返回的数据是相同的,但是Select方法的结果只是数据项的序列,而不是数据源本身。查询表达式的结果和源数据永远不会是同一个对象5 //当有其它的操作的时候,就不用为编译器保留一个"空操作"Select子句
1 //按价格排序,从大到小2 var resutl3 = from item in list3 orderby item.Price descending4 select item;5 //转换为list.OrderByDescending(item => item.Price);
1 //先用价格再按状态排序2 var result4 = from item in list3 orderby item.Price, item.State4 select item;
let子句只不过引入一个新的范围变量,它的值是基于其它范围变量,语法格式:let 标识符 = 表达式
1 //货品是用RMB的,现在使用HK来记录,使用投影返回匿名对象的序列2 var result5 = from item in list3 let hk = item.Price / 0.84 select new { hk = hk, item = item };
let操作符对一个表达式进行求值,并引入新的范围变量
相应于数据库中的概念,使用两张表,这里是使用两个序列,通过匹配两者之间的数据行来创建结果。
内连接涉及两个序列。一个键选择器表达式应用于第1个序列的每一个元素,另外一个键选择器(可能完全不同)应用于第二个序列的每一个元素。连接的结果是一个包含所有配对元素的序列,配对的规则是第1个元素的键与第2个元素的键相同。
连接的格式:join 右边序列元素 in 右边序列
on 左边序列元素的key equals 右边序列元素的key
1 /// <summary> 2 /// 用于存放珠宝的盒子 3 /// </summary> 4 class Box 5 { 6 /// <summary> 7 /// 盒子有一个珠宝类型的属性,与要放的珠宝类型一致 8 /// </summary> 9 public Jewellery.JewelleryType jewelleryType { get; set; }10 public string BoxName { get; set; }11 }
1 //打印每个珠宝存放的盒子,珠宝的状态要是存货2 var result6 = from box in boxList3 join item in list4 on box.jewelleryType equals item.Type5 where item.State == Jewellery.JewelleryState.Stock6 select new { BoxName = box.BoxName, Price = item.Price };7 8 result6.ToList().ForEach(item => Console.WriteLine("位置:" + item.BoxName + ";" + "价格:" + item.Price));
结果如下
可见在box1中放了一件价格为500的珠宝,在box3中放着一个价格为300的珠宝。这里作为两个序列的key的是珠宝的类型Jewellery.JewelleryType
请斧正。
新闻热点
疑难解答