21.C#序列过虑、排序、let子句和连接(十一章11.3-11.5)

  哈哈,隔了一个星期,再怎么样都要发一篇,要多看书啊,书不能停~~~

  • 使用where子句进行过虑

  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 JewelleryType
10     {
11         Ring,
12         Necklace,
13         Bracelet
14     }
15     /// <summary>
16     /// 当前珠宝状态
17     /// <list type="Stock">存货</list>
18     /// <list type="Repair">修理中</list>
19     /// <list type="Sold">已售出</list>
20     /// </summary>
21     public enum JewelleryState
22     {
23         Stock,
24         Repair,
25         Sold
26     }
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 list
13              where item.Price > 300 && item.Type == Jewellery.JewelleryType.Bracelet
14              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 list
20                where item.State == Jewellery.JewelleryState.Repair
21                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 list
2               select item;
3 //这个就是所谓的退化表达式,编译器会故意生成一个对Select方法的调用,即使它什么都没有做,但result2和list有很大的不同,
4 //两个序列返回的数据是相同的,但是Select方法的结果只是数据项的序列,而不是数据源本身。查询表达式的结果和源数据永远不会是同一个对象
5 //当有其它的操作的时候,就不用为编译器保留一个"空操作"Select子句
  • 使用orderby子句进行排序
1 //按价格排序,从大到小
2 var resutl3 = from item in list
3               orderby item.Price descending
4               select item;
5 //转换为list.OrderByDescending(item => item.Price);
1 //先用价格再按状态排序
2 var result4 = from item in list
3               orderby item.Price, item.State
4               select item;
  • let子句

  let子句只不过引入一个新的范围变量,它的值是基于其它范围变量,语法格式:let 标识符 = 表达式

1 //货品是用RMB的,现在使用HK来记录,使用投影返回匿名对象的序列
2 var result5 = from item in list
3               let hk = item.Price / 0.8
4               select new { hk = hk, item = item };

  let操作符对一个表达式进行求值,并引入新的范围变量

  • 连接 

  相应于数据库中的概念,使用两张表,这里是使用两个序列,通过匹配两者之间的数据行来创建结果。

  1. 使用join子句的内连接

  内连接涉及两个序列。一个键选择器表达式应用于第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 boxList
3               join item in list
4               on box.jewelleryType equals item.Type
5               where item.State == Jewellery.JewelleryState.Stock
6               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

  请斧正。

 

posted on   a2htray  阅读(1230)  评论(1编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示