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.rhkb.cn/news/12442.html

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

相关文章

毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 卷积神经网络 1.2 目标检测算法 1.3 注意力机制 二、 数据集 2.1 数据采集 2.2 数据标注 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 3.2 结果分析 最后 前言 &#x1f4c5;大四是整个大学…

AI取代人类?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

刷题记录 动态规划-7: 63. 不同路径 II

题目&#xff1a;63. 不同路径 II 难度&#xff1a;中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。…

深度求索DeepSeek横空出世

真正的强者从来不是无所不能&#xff0c;而是尽我所能。多少有关输赢胜负的缠斗&#xff0c;都是直面本心的搏击。所有令人骄傲振奋的突破和成就&#xff0c;看似云淡风轻寥寥数语&#xff0c;背后都是数不尽的焚膏继晷、汗流浃背。每一次何去何从的困惑&#xff0c;都可能通向…

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…

【论文复现】粘菌算法在最优经济排放调度中的发展与应用

目录 1.摘要2.黏菌算法SMA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种改进粘菌算法&#xff08;ISMA&#xff09;&#xff0c;并将其应用于考虑阀点效应的单目标和双目标经济与排放调度&#xff08;EED&#xff09;问题。为提升传统粘菌算法&#xf…

C++基础(2)

目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.29 NumPy+Scikit-learn(sklearn):机器学习基石揭秘

2.29 NumPyScikit-learn&#xff1a;机器学习基石揭秘 目录 #mermaid-svg-46l4lBcsNWrqVkRd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46l4lBcsNWrqVkRd .error-icon{fill:#552222;}#mermaid-svg-46l4lBcsNWr…

圆上取点(例题)

Protecting The Earth &#xff08;圆内取点&#xff09; 题目描述&#xff1a; 给定 K (地球上的人数)&#xff0c;你必须制作一个保护罩来保护他们。(地球上的人数&#xff09;&#xff0c;你必须制作一个保护罩来保护他们。 已知一个人只能站在整数的坐标上&#xff0c…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.19 线性代数核武器:BLAS/LAPACK深度集成

2.19 线性代数核武器&#xff1a;BLAS/LAPACK深度集成 目录 #mermaid-svg-yVixkwXWUEZuu02L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yVixkwXWUEZuu02L .error-icon{fill:#552222;}#mermaid-svg-yVixkwXWUEZ…

[leetcode·回溯算法]回溯算法解题套路框架

本文参考labuladong算法笔记[回溯算法解题套路框架 | labuladong 的算法笔记] 本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;如何学习回溯算法&#xff1f;回溯算法代码是否有规律可循&#xff1f; 其实回溯算法和我…

SQL Server中RANK()函数:处理并列排名与自然跳号

RANK()是SQL Server的窗口函数&#xff0c;为结果集中的行生成排名。当出现相同值时&#xff0c;后续排名会跳过被占用的名次&#xff0c;形成自然间隔。与DENSE_RANK()的关键区别在于是否允许排名值连续。 语法&#xff1a; RANK() OVER ([PARTITION BY 分组列]ORDER BY 排序…

多线程的常用方法

getName和setName方法 注意点 setName方法最好放在线程启动之前 最好在线程启动之前修改名字&#xff0c;因为线程启动之后&#xff0c;如果执行过快的话&#xff0c;那么在调用 setName() 之前线程可能就已经结束了 MyThread t1 new MyThread("haha"); t1.setNa…

Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏

前言 鼠标光标在游戏界面太碍眼了&#xff0c;要隐藏掉。 详细操作 新建一个脚本HideCursor&#xff0c;用于隐藏光标。 写入以下代码。 意义&#xff1a;游戏开始自动隐藏光标&#xff0c;按Esc&#xff08;显示<-->隐藏&#xff09;。 using System.Collections; using…

【Linux系统】信号:再谈OS与内核区、信号捕捉、重入函数与 volatile

再谈操作系统与内核区 1、浅谈虚拟机和操作系统映射于地址空间的作用 我们调用任何函数&#xff08;无论是库函数还是系统调用&#xff09;&#xff0c;都是在各自进程的地址空间中执行的。无论操作系统如何切换进程&#xff0c;它都能确保访问同一个操作系统实例。换句话说&am…

冰蝎v4.0.5 来啦

webshell始终是渗透测试的热门&#xff0c;上次护网写冰蝎检测规则&#xff0c;加密流量&#xff0c;有点压力&#xff0c;今天终于有空来复现一下&#xff0c;我知道玩知乎的大佬很多&#xff0c;轻一点喷&#xff0c;学习新知识不丢人&#xff5e; ailx10 1949 次咨询 4.9 …

WPS怎么使用latex公式?

1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…

基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

安全策略配置

需求: 1、VLAN 2属于办公区;VLAN 3属于生产区 2、办公区PC在工作日时间(周一至周五&#xff0c;早8到晚6)可以正常访问0A Server&#xff0c;其他时间不允许 3、办公区PC可以在任意时刻访问web server 4、生产区PC可以在任意时刻访问0A Server&#xff0c;但是不能访问Web serv…

【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…