首页 > 其他分享 >Winform/Csharp中使用Linq的Where条件筛选、Select字段映射(左外连接并设置无匹配时默认值)、OrderBy(排序并自定义排序规则)

Winform/Csharp中使用Linq的Where条件筛选、Select字段映射(左外连接并设置无匹配时默认值)、OrderBy(排序并自定义排序规则)

时间:2023-03-27 19:34:47浏览次数:56  
标签:carNumber 默认值 string 自定义 driver number set 排序 public

场景

Java8新特性-Stream对集合进行操作的常用API:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657

上面讲的是在Java中使用Stream中对集合的常用操作。

在C#中Linq是有对应的类似的api。

完整和详细的用法可自行查阅文档,下面记录使用过程中的一些非常规操作。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、Where条件筛选

需要自定义筛选规则,筛选函数需要调用一些三方工具类

                    var keyList = keys.Where(key =>
                       {
                           CarVo car = redis.StringGet<CarVo>(key);
                           PointF point = new PointF(Convert.ToSingle(car.x), Convert.ToSingle(car.y));
                           bool result = GisHelper.isPointInPolygon(point, waitingRoomPoints);
                           return result;
                       }
                    );

比如这里是校验坐标是否在指定区域内,用到的GisHelper是工具类,附工具类实现

        public static bool isPointInPolygon(PointF point ,PointF[] points) {
            GraphicsPath myGraphicsPath = new GraphicsPath();
            Region myRegion = new Region();
            myGraphicsPath.Reset();
            myGraphicsPath.AddPolygon(points);
            myRegion.MakeEmpty();
            myRegion.Union(myGraphicsPath);
            //返回判断点是否在多边形里
            bool result = myRegion.IsVisible(point);
            return result;
        }

2、Select自定义映射规则,实现调用三方方法

模糊搜索到redis中的key的集合,遍历这些key,并映射到key对应的value的集合

                        var carVoList = keyList.Select(key =>
                        {
                            CarVo car = redis.StringGet<CarVo>(key);
                            return car;
                        })

这里用的方法可以参考如下连接redis并存取数据的实现

Winform/Csharp中使用StackExchange.Redis连接Redis存取数据并序列化对象/反序列化(支持redis key 模糊搜索):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/129766120

3、OrderBy自定义排序规则,先按照实体的某个属性,再按照另一个属性

                        var carVoList = keyList.Select(key =>
                        {
                            CarVo car = redis.StringGet<CarVo>(key);
                            return car;
                        })//先按照车辆类型排序
                        .OrderBy(a =>
                        {
                            //人车排在最前面
                            if (a.carType.Equals("1"))
                            {
                                return 1;
                            }//指挥车排在第二位
                            else if (a.carType.Equals("3"))
                            {
                                return 2;
                            }//其他车辆排在后面
                            else
                            {
                                return 3;
                            }
                        })//其次按照车牌号字段排序
                          .ThenBy(a => a.carNumber);

比如这里从redis中查询到数据之后,解析到对象,并先根据对象的carType进行排序,

如果类型为1则排在最前面,类型是3,排在第二优先级,其他的类型排在后面,然后

在每个类型中再按照车牌号这个字段排序。

这里的return 1,数字越小优先级越高。

4、Select映射时从一个对象,映射到另一个对象,并新增一个递增的序号字段

                int numberIndex = 1;
                var carVoListWithFixedData = carVoList.Select(carVo =>
                {
                    ResultVo resultVo = new ResultVo
                    {                     
                        number = numberIndex++,
                        carNumber = carVo.carNumber,
                    };
                    resultVo.team = "测试班组";
                    resultVo.direction = "测试方向";
                    return resultVo;
                });

5、linq select 左外连接

包含左边的表的所有行,如果右边表中某行没有匹配,该行内容为空NULL。

                            var query = from carVo in results
                                        join mail in mailList on carVo.carNumber equals mail.car_number into result1
                                        from result in result1.DefaultIfEmpty()
                                        select new ResultVo(carVo.number, carVo.team, carVo.direction, carVo.carNumber, result == default(BusMailList) ? String.Empty : result.driver_name);
                            results = query.ToList();

这里以左边results的结果为主,results有多少条则最终会有多少条。

根据results中每个对象的car_number属性去匹配在mailList中与car_number相等的数据的driver_name属性,如果有则匹配显示,

没有则未空,并将最终结果映射到新的对象。

这里的BusMailList就是mailList的每个对象。

附这里的mailList集合的每个对象BusMailList的类

    public class BusMailList
    {
        public long binding_time { get; set; }
        public string car_number { get; set; }
        public string driver_name { get; set; }
        public string driver_number { get; set; }
        public int id { get; set; }
        public long update_time { get; set; }
    }

以及results集合的每个对象ResultVo的类

    class ResultVo
    {
        [Description("序号")]
        public int number { get; set; }
        [Description("班组")]
        public string team { get; set; }
        [Description("方向")]
        public string direction { get; set; }
        [Description("车号")]
        public string carNumber { get; set; }
        [Description("司机")]
        public string driver { get; set; }


        public ResultVo()
        {

        }

        public ResultVo(int _number, string _carNumber, string _driver)
        {
            number = _number;
            carNumber = _carNumber;
            driver = _driver;
        }
        public ResultVo(int _number, string _carNumber)
        {
            number = _number;
            carNumber = _carNumber;
        }

        public ResultVo( string _carNumber, string _driver)
        {          
            carNumber = _carNumber;
            driver = _driver;
        }

        public ResultVo(int _number,string _team,string _direction,string _carNumber,string _driver)
        {
            number = _number;
            team = _team;
            direction = _direction;
            carNumber = _carNumber;
            driver = _driver;
        }
    }

 

标签:carNumber,默认值,string,自定义,driver,number,set,排序,public
From: https://www.cnblogs.com/badaoliumangqizhi/p/17262587.html

相关文章

  • SpringBoot多数据源(自定义注解,动态数据源,事务实现)
    一、数据库配置文件(这里用的是阿波罗配置中心,也可以是application.yml文件)#mysql本地数据源1spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driverspr......
  • C语言—模范qsort()实现一个冒泡排序的通用算法
    目录一、库方法qsort参数解释二、冒泡排序解释三、模拟实现1、冒泡排序函数2、数值交换函数3、测试函数4、运行结果5、源代码一、库方法qsort参数解释二、冒泡排序解释三、......
  • c#Winform自定义控件-目录-HZHControls
    官网http://www.hzhcontrols.com前提入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。GitHub:https://github.com/kwwwvagaa/NetWinformControl......
  • 简述几种常用的排序算法
    摘要:归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。理解归并排序的重点是理解递推公式和merge()合并函数。本......
  • LeetCode 周赛 338,贪心 / 埃氏筛 / 欧氏线性筛 / 前缀和 / 二分查找 / 拓扑排序
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周末是LeetCode第338场周赛,你参加了吗?这场周赛覆盖的知识点很多,第四题......
  • 监控事件系列——SQL Trace(默认跟踪与自定义跟踪)
    目录【1】服务器端跟踪(ServerSideTrace)【1.1】概念与使用【1.2】跟踪的基本操作【1.3】七大事件监控【2】默认跟踪的应用 【2.1】常用事件跟踪(删除、审核登......
  • 【JavaScript快速排序算法】不同版本原理分析
    说明快速排序(QuickSort),又称分区交换排序(partition-exchangesort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的......
  • php 处理二维数组(去除重复项,排序,转换,去空白等)
    技巧提示:  array_keys($array)//返回所有键名array_values($array)//返回所有键值$result=array_reverse($input);//将数组颠倒,不保留键名$result_keyed=array_r......
  • python中sorted排序
     key是自定义函数reverse=False,升序(默认)reverse=True,倒序#不区分大小写排序sorted(['bob','aBout','ZOO','Credit'],key=str.lower)#按绝对值排序sorted([36,5,-12......
  • 排序算法
    排序算法本文默认升序(从小到大)排序1.入门排序1.1选择排序在后(n-i)个元素中找到一个最小的,放在第i位。时间复杂度为O(\(n^2\))。代码实现如下:for(inti=0;i<n;i+......