C# List 列表综合运用实例⁓Hypak原始数据处理编程小结

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结

  • 1、一个数组解决很麻烦引出的问题
    • 1.1、RAW 文件尾部数据如下:
    • 1.2、自定义标头 ADD 或 DEL 的数据结构如下:
  • 2、程序 C# 源代码的编写和剖析
  • 2.1、使用 ref 关键字,通过引用将参数传递,以返回需要的数据行 List<string>
  • 2.2、使用 return 关键字,采用函数返回需要的数据行 List<string>
  • 3、程序过程编程小结

1、一个数组解决很麻烦引出的问题

春节期间,单身程序猿在家,咸的无聊,折腾编了很久的程序,一个 Hypack 测量成果 RAW 文件的处理程序,其中关于手工鼠标添加和删除打标记录,遇到一个数组解决很麻烦的问题,选择部分RAW 文件尾部作为示例。

1.1、RAW 文件尾部数据如下:

FIX 99 37639.880 115 626269.893 3216969.963
EC1 1 37640.137 1.560
POS 0 37640.200 626269.880 3216970.131
QUA 0 37640.200 7 3.000 1.000 9.000 2.000 0.000 0.000 0.000
RAW 0 37640.200 4 290379.29870 1121779.71130 9.88800 22720.20000
MSG 0 37640.137 $GPGGA,022720.20,2903.792987,N,11217.797113,E,2,09,1.0,9.888,M,0.0,M,8.0,0643*7A
MSG 0 37640.179 $GPVTG,355.0,T,,M,0.97,N,1.80,K,P*18
MSG 0 37640.199 $GPZDA,022720.20,27,03,2024,00,00*63
......
......
EC1 1 37641.138 1.320
POS 0 37641.200 626269.879 3216970.530
QUA 0 37641.200 7 3.000 1.000 8.000 2.000 0.000 0.000 0.000
RAW 0 37641.200 4 290379.32030 1121779.71150 9.92700 22721.20000
MSG 0 37641.138 $GPGGA,022721.20,2903.793203,N,11217.797115,E,2,08,1.0,9.927,M,0.0,M,4.0,0643*72
MSG 0 37641.181 $GPVTG,9.1,T,,M,0.68,N,1.26,K,P*1F
MSG 0 37641.199 $GPZDA,022721.20,27,03,2024,00,00*62
FIX 99 37641.316 116 626269.879 3216970.530

固定了 SP-6050 GPS 和 HY1603 测深仪的测量船,在航行中测量时,Hypack 软件产生原始成果 RAW 文件,其尾部数据与上雷同。

RAW 文件数据说明:

FIX 标识是某一时刻 Hypack 利用 HY1603 测深仪进行水下地形测量记录的固定打标点数据,
EC1 标识是某一时刻测量记录的水深数据,
POS 标识是某一时刻测量记录的 GPS 平面坐标数据,
QUA 标识是某一时刻测量记录的 GPS 坐标数据质量与精度,
RAW 标识是某一时刻测量记录的 GPS 坐标 WGS84 原始数据,
MSG 标识是某一时刻测量记录的 GPS 输出的各类原始消息(如 GPGGA、GPVTG、GPZDA),

在测量过程中受地形变化,FIX 固定打标点数据不能控制地形图的精度,需要手动添加地形变化显著的突出测量点,或删除多余的平坦测量点,这些工作可以通过自编程序进行处理和计算,通过自编程序向原始成果 RAW 文件尾部加入自定义标头为 ADD 或 DEL 的数据,以指示需要添加或删除某一时刻的 FIX 固定打标点数据。

1.2、自定义标头 ADD 或 DEL 的数据结构如下:

ADD FIX 37530.812 117 626281.983 3216777.812
DEL FIX 37616.237 110
DEL FIX 37539.000 80 
DEL FIX 37530.812 117
DEL FIX 37530.812 117
Add 118 38203.57 11.75
Add 129 38260.5 5.35
Add 129 38260.5 5.35
Add 130 38247.56 10.59
Del 130 38247.56 10.59
Del 129 38260.5 5.35
Del 129 38260.5 5.35
Del 117 37530.812 6.88

以上数据以空格分隔;以分隔表示一行数据的列定义。
以上数据中全大写字母 ADD 或 DEL 是新的定义格式,按固定打标 FIX 标识的新规范制定;
以上数据存在新旧标识数据,以便程序兼容旧标识数据,能识别和处理旧标识数据。

Add 或 Del 是旧的定义格式,按固定打标 FIX 标识的旧规范制定。

ADD 新定义格式:标头,固定,时间,事件号,东坐标,北坐标
DEL 新定义格式:标头,固定,时间,事件号
Add 旧定义格式:标头,事件号,时间,水深
Del 旧定义格式: 标头,事件号,时间,水深

以上数据有意添加了重复的数据行,是因为程序处理中。或可能产生此类数据。需要在新程序中更新该类错误。

产生此类数据的原则和前提:
1、添加 ADD 和删除 DEL 数据行,第 3 列和第 4 列不能相同,不可重复,即添加和删除了同一个数据点,应该抵消,无需存在。

如下数据,不应该出现在以上 1.2 节示例数据中:

Add 130 38247.56 10.59
Del 130 38247.56 10.59

2、相同标识的数据行,第 3 列和第 4 列相同的只能存在一个,添加 ADD 和删除 DEL 标识的唯一性。
如下数据,第二行和第三行不重复,是正确的,可以追加写入到原始成果 RAW 文件尾部:

ADD FIX 38203.570 118
DEL FIX 37539.000 80
DEL FIX 37616.237 110

3、为了向下兼容,新和旧定义格式混合时,相同标识的数据行,时间和事件相同的不应该存在。

DEL FIX 37530.812 117
Del 117 37530.812 6.88

2、程序 C# 源代码的编写和剖析

2.1、使用 ref 关键字,通过引用将参数传递,以返回需要的数据行 List

采用方法过程,void 关键字返回类型,指定该方法不返回值,采用 ref 关键字参数传递数据。
完整处理和分析过程如下:

        /// <summary>删除重复,重建添加删除打标记录</summary>/// <param name="ListAddOrDelMarks">返回符合自定义规范的 List数据列</param>private void RebuildDuplicateMarkings(ref List<string> ListAddOrDelMarks)//放入其它类使用 public static 替代 private {if (ListAddOrDelMarks.Count > 1)//有2行数据才进行处理{ListAddOrDelMarks = ListAddOrDelMarks.Distinct().ToList();//返回非重复的数列,删除相同的ADD或DEL行// foreach (string ListRow in ListAddOrDelMarksRows){Console.WriteLine(String.Join(", ", ListRow));}Console.WriteLine();for (int i = 0; i < ListAddOrDelMarks.Count; i++)//转换 Add 和 Del 行到新标准格式(DEL FIX 37616.237 110和ADD FIX 37530.812 117){string ListRowData = ListAddOrDelMarks[i];if (ListRowData.Substring(0, 3) == "Del"){string[] SplitListRow = ListRowData.Split(' ');ListAddOrDelMarks[i] = $"DEL FIX {Convert.ToDouble(SplitListRow[2]).ToString("0.000")} {SplitListRow[1]}";//Console.WriteLine($"DEL FIX {SplitListRow[2]} {SplitListRow[1]}");}else if (ListRowData.Substring(0, 3) == "Add"){string[] SplitListRow = ListRowData.Split(' ');ListAddOrDelMarks[i] = $"ADD FIX {Convert.ToDouble(SplitListRow[2]).ToString("0.000")} {SplitListRow[1]}";//Console.WriteLine($"ADD FIX {SplitListRow[2]} {SplitListRow[1]}");}}ListAddOrDelMarks.Sort();//LIST排序//foreach (string ListRow in ListAddOrDelMarksRows) { Console.WriteLine(ListRow); } Console.WriteLine();List<List<string>> TwoDimensionalList = new List<List<string>>();//新建二维LIST 以处理其它去重复foreach (string ListRowData in ListAddOrDelMarks){List<string> OneDimensionalList = new List<string>(ListRowData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));//行数据分裂为LIST<string>TwoDimensionalList.Add(OneDimensionalList);//将一维 LIST 添加到二维 LIST}int columnIndex = 2;// 检查第3列(索引从0开始)List<string> duplicates = TwoDimensionalList.GroupBy(list => list[columnIndex])// 获取该列的所有值及其出现的次数.Where(group => group.Count() > 1).Select(group => group.Key).ToList();TwoDimensionalList.RemoveAll(list => duplicates.Contains(list[columnIndex]));// 移除TwoDimensionalList二维LIST所有第3列包含重复值的行List<string> NewListAddOrDelMarksRows = new List<string>();//新建一维列表 Listforeach (List<string> ListRow in TwoDimensionalList){NewListAddOrDelMarksRows.Add(String.Join(" ", ListRow));//二维 List 转换为一维列表 List // Console.WriteLine(String.Join(" ", ListRow));}ListAddOrDelMarks = NewListAddOrDelMarksRows;//返回符合规则的数列NewListAddOrDelMarksRows.Clear();//删除使用过的数列,释放内存占用duplicates.Clear();TwoDimensionalList.Clear();}}

2.2、使用 return 关键字,采用函数返回需要的数据行 List

采用函数返回值,可以封装到引用类中,以方便引用。
完整处理和分析过程如下:

  /// <summary>删除重复,重建添加删除打标记录</summary>/// <param name="ListAddOrDelMarks">添加或删除的重复打标记录</param>/// <returns>返回符合自定义规范的 List数据列</returns>public static List<string> RebuildDuplicateMarkings(List<string> ListAddOrDelMarks){if (ListAddOrDelMarks.Count > 1){ListAddOrDelMarks = ListAddOrDelMarks.Distinct().ToList();//返回非重复的数列,删除相同的ADD或DELfor (int i = 0; i < ListAddOrDelMarks.Count; i++)//转换Add和Del行为标准格式(DEL FIX 37616.237 110和ADD FIX 37530.812 117){string ListRowData = ListAddOrDelMarks[i];if (ListRowData.Substring(0, 3) == "Del"){string[] SplitListRow = ListRowData.Split(' ');ListAddOrDelMarks[i] = $"DEL FIX {Convert.ToDouble(SplitListRow[2]).ToString("0.000")} {SplitListRow[1]}";}else if (ListRowData.Substring(0, 3) == "Add"){string[] SplitListRow = ListRowData.Split(' ');ListAddOrDelMarks[i] = $"ADD FIX {Convert.ToDouble(SplitListRow[2]).ToString("0.000")} {SplitListRow[1]}";}}ListAddOrDelMarks.Sort();//LIST排序List<List<string>> TwoDimensionalList = new List<List<string>>();//新建二维LISTforeach (string ListRowData in ListAddOrDelMarks){List<string> OneDimensionalList = new List<string>(ListRowData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));//行数据分裂为LISTTwoDimensionalList.Add(OneDimensionalList);//将一维LIST添加到二维LIST}int columnIndex = 2;// 检查第3列时间值(索引从0开始)List<string> duplicates = TwoDimensionalList.GroupBy(list => list[columnIndex])// 获取该列的所有值及其出现的次数.Where(group => group.Count() > 1).Select(group => group.Key).ToList();TwoDimensionalList.RemoveAll(list => duplicates.Contains(list[columnIndex]));// 移除TwoDimensionalList二维LIST所有3列包含重复值的行List<string> NewListAddOrDelMarksRows = new List<string>(); //新建一维LIST,将二维LIST转换为一维LISTforeach (List<string> ListRow in TwoDimensionalList){NewListAddOrDelMarksRows.Add(String.Join(" ", ListRow));}duplicates.Clear();TwoDimensionalList.Clear();return NewListAddOrDelMarksRows;//返回一维LIST}else{return null; //返回空}}

3、程序过程编程小结

通过以上程序处理,1.2 节的示例数据输出结构如下

ADD FIX 38203.570 118
DEL FIX 37539.000 80
DEL FIX 37616.237 110

返回的 List 数据符合自定义要求,程序设计思路更加清晰,解决了数组很难处理的麻烦,而且程序代码行数量不大,代码简洁,运行速度提升。

处理了不符合定义要求的重复数据行,通过鼠标左右双击添加 ADD 和删除 DEL 固定打标点的程序代码,就不会出错了,就加快了编写和优化 FIX 固定打标点数据的图形展示、数据表显示的进度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面&#xff0c;相当于一个个小的对话框&#xff0c;当然你放在其它地方也可以。 ;原理是&#xff0c;创建一张BMP位图&#xff0c;比如下例用一张168*24的图&#xff0c;平均分成7部分&#x…

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

ArrayList 扩容机制的源码剖析

在 Java 编程中&#xff0c;ArrayList是一个常用的集合类&#xff0c;它实现了List接口&#xff0c;底层基于数组实现。与普通定长数组不同&#xff0c;ArrayList能够根据元素的添加情况动态调整数组的大小&#xff0c;这就是其扩容机制。下面我们将深入剖析ArrayList扩容机制的…

The specified Gradle distribution ‘gradle-bin.zip‘ does not exist.

The specified Gradle distribution ‘https://services.gradle.org/distributions/gradle-bin.zip’ does not exist. distributionUrl不存在&#xff0c;关联不上&#xff0c;下载不了&#xff0c;那就匹配一个能下载的 distributionUrlhttps://services.gradle.org/distrib…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

Cesium点集中获取点的id,使用viewer.value.entities.getById报错的解决方法

错误代码&#xff1a; viewer.value.entities.getById(pickedObject.id) 报错&#xff1a; 可以正常获取movement.position但是一直出现如下报错&#xff0c;无法获得航点的id&#xff0c;通过断点定位为 viewer.value.entities.getById(pickedObject.id)导致的报错 解决方…

ARM Linux Qt使用JSON-RPC实现前后台分离

文章目录 1、前言2、解决方案2.1、JSON-RPC2.2、Qt中应用JSON-RPC的框架图2.3、优点2.4、JSON-RPC 1.0 协议规范 3、程序示例3.1、Linux C&#xff08;只例举RPC Server相关程序&#xff09;3.2、Qt程序&#xff08;只例举RPC Client相关程序&#xff09; 4、编译程序4.1、交叉…

教程 | i.MX RT1180 ECAT_digital_io DEMO 搭建(一)

本文介绍 i.MX RT1180 EtherCAT digital io DEMO 搭建&#xff0c;Master 使用 TwinCAT &#xff0c;由于步骤较多&#xff0c;分为上下两篇&#xff0c;本文为第一篇&#xff0c;主要介绍使用 TwinCAT 控制前的一些准备。 原厂 SDK 提供了 evkmimxrt1180_ecat_examples_digit…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误&#xff0c;断网安装即可&#xff01; 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本&#xff08;如 Netplan 或传统的 ifupdown&#xff09;&#xff0c;配置方法有所不同。以下是基于 Netplan 的配置方法&#xff08;适用于Ubuntu 17.10及更高版…

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…

AI推理性能之王-Groq公司开发的LPU芯片

Groq公司开发的LPU&#xff08;Language Processing Unit&#xff0c;语言处理单元&#xff09;芯片是一种专为加速大规模语言模型&#xff08;LLM&#xff09;和其他自然语言处理任务而设计的新型AI处理器。以下是对其技术特点、性能优势及市场影响的深度介绍&#xff1a; 技…

rk3506 sd卡启动

1 修改系统配置文件,打开ext4 #SDMMC RK_ROOTFS_TYPE"ext4" RK_ROOTFS_INSTALL_MODULESy RK_WIFIBT_CHIP"AIC8800" # RK_ROOTFS_LOG_GUARDIAN is not set RK_UBOOT_CFG_FRAGMENTS"rk3506_tb" RK_UBOOT_SPLy RK_KERNEL_CFG"rk3506_defconfi…

Docker 安装详细教程(适用于CentOS 7 系统)

目录 步骤如下&#xff1a; 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版&#xff08;免费&#xff0c;支持周期7个月&#xff09;&#xf…

【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证8 导入官方契约测试集合9 契约测试集合的详细配置9.1 env-apiKey 的创建与设置9.2 env-workspaceId 的设置9.3 Mock 服务器及 env-server 的配置9.4 API 测试实例的配置…

使用DeepSeek R1 + 了解部署

官网注册 R1模型&#xff0c;推理模型 参考视频理解 理解大语言模型的本质 大模型在训练时是将内容token化的大模型知识是存在截止时间的大模型缺乏自我认知、自我意识记忆有限输出长度有限 智商理解&#xff0c;例如下面的DeepSeek的测试&#xff1a; 用DeepSeek 官网手…

2024年12月 Scratch 图形化(三级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;三级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共18题&#xff0c;共50分) 第 1 题 气温和对应的穿衣建议如下表所示&#xff0c;下列选项能正确给出穿衣建议的是&#xff1f;&#xff08; &#xff09; A. …

Gauss高斯:建表语法,存储方式,OLTP和OLAP,系统时间,数组,分组(grouping set,rollup)

数据库和表的语法 数据库 表 oracle,高斯, hive的默认存储方式都是列式存储 存储方式 高斯数据库&#xff08;GaussDB&#xff09;支持列式存储和行式存储 OLTP 与 OLAP OLTP&#xff08;联机事务处理&#xff0c;Online Transaction Processing&#xff09;是一种用于管理…

数据中心服务器对PCIe测试的需求、挑战和应用

人工智能和机器学习技术的迅猛发展&#xff0c;尤其是大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;对计算资源和数据传输速度提出了更高的要求&#xff0c;从而激发了对更高带宽解决方案的迫切需求。PCIe作为数据中心服务器间互联的主力军&#xff0c;承担着高速数…