当前位置: 首页 > article >正文

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 固定打标点数据的图形展示、数据表显示的进度。

相关文章:

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

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结 1、一个数组解决很麻烦引出的问题1.1、RAW 文件尾部数据如下:1.2、自定义标头 ADD 或 DEL 的数据结构如下&#xff1a; 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字&#xff0c;通过引用将参数传递&#xff0c;以…...

MYSQL面试题总结(题目来源JavaGuide)

MYSQL基础架构 问题1&#xff1a;一条 SQL语句在MySQL中的执行过程 1. 解析阶段 (Parsing) 查询分析&#xff1a;当用户提交一个 SQL 语句时&#xff0c;MySQL 首先会对语句进行解析。这个过程会检查语法是否正确&#xff0c;确保 SQL 语句符合 MySQL 的语法规则。如果发现…...

【CSS】什么是响应式设计?响应式设计的基本原理,怎么做

在当今多设备、多屏幕尺寸的时代&#xff0c;网页设计面临着前所未有的挑战。传统的固定布局已无法满足用户在不同设备上浏览网页的需求&#xff0c;响应式设计&#xff08;Responsive Web Design&#xff09;应运而生&#xff0c;成为网页设计的趋势和标准。本文将深入探讨响应…...

redis实际开发应用简单实现

短信登录 首先来看看登录与注册常规实现流程如下&#xff1a; 其中&#xff0c;很多网站都有手机号验证码登录功能 如百度 实现之前咱可以来验证码有啥特点&#xff1a;一定时间内过期、验证码随机、与手机号会唯一匹配 所以可以使用redis的string来实现更容易&#xff0c;k…...

Hive on Spark优化

文章目录 第1章集群环境概述1.1 集群配置概述1.2 集群规划概述 第2章 Yarn配置2.1 Yarn配置说明2.2 Yarn配置实操 第3章 Spark配置3.1 Executor配置说明3.1.1 Executor CPU核数配置3.1.2 Executor内存配置3.1.3 Executor个数配置 3.2 Driver配置说明3.3 Spark配置实操 第4章 Hi…...

【实践案例】基于大语言模型的海龟汤游戏

文章目录 项目背景提示词构建海龟汤主持人真相判断专家 具体实现流程文心一言大语言模型“海龟汤”插件参考 项目背景 “海龟汤”作为一种聚会类桌游&#xff0c;又称情境推理游戏&#xff0c;是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件&…...

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…...

解决vscode扩展插件开发webview中的请求跨域问题

在webview中是无法发送跨域请求的&#xff0c;可以通过消息机制&#xff0c;在插件中发请求&#xff0c;然后将请求结果传递给webview 我的代码是基于vscode-webview-ui-toolkit-samples-vue来写的 webview vue组件中的代码示例 async function initData() {// 向插件发送消…...

P3078[USACO13MAR] Poker Hands S

P3078[USACO13MAR] Poker Hands S https://www.luogu.com.cn/problem/P3078 前言 学习差分后写的第一道题&#xff0c;直接给我干懵逼&#xff0c;题解都看不懂……吃了个晚饭后开窍写出来了&#xff0c;遂成此篇。 题目 翻译版本 Bessie 和她的朋友们正在玩一种独特的扑克游…...

创建前端项目的方法

目录 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI 2.方式一&#xff1a;vue create项目名称 3.方式二&#xff1a;vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI npm i vue/cli -g 2.方式一&…...

Java 大数据与区块链的融合:数据可信共享与溯源(45)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【建站】专栏目录

建站专栏的想法有很多&#xff0c;想写穷鬼如何快速低成本部署前后端项目让用户能访问到&#xff0c;如何将网站收录到百度&#xff0c;bing&#xff0c;google并优化seo让搜索引擎搜索到网站&#xff0c;想写如何把网站加入google广告或者接入stripe信用卡首款平台收款&#x…...

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…...

nlp文章相似度

1. 基于词袋模型&#xff08;Bag of Words&#xff09; 方法&#xff1a; 将文本表示为词频向量&#xff08;如TF-IDF&#xff09;&#xff0c;通过余弦相似度计算相似性。 优点&#xff1a;简单快速&#xff0c;适合短文本或主题明显的场景。 缺点&#xff1a;忽略词序和语…...

ROS应用之SwarmSim在ROS 中的协同路径规划

SwarmSim 在 ROS 中的协同路径规划 前言 在多机器人系统&#xff08;Multi-Robot Systems, MRS&#xff09;中&#xff0c;SwarmSim 是一个常用的模拟工具&#xff0c;可以对多机器人进行仿真以实现复杂任务的协同。除了任务分配逻辑以外&#xff0c;SwarmSim 在协同路径规划方…...

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 &#xff08;一&#xff09;冒泡排序 基本思想&#xff1a;比较相邻的元素&#xff0c;如果顺序错误就把它们交换过来。 &#xff08;二&#xff09;选择排序 基本思想…...

深度学习中常用的评价指标方法

深度学习中常用的评价指标方法因任务类型&#xff08;如分类、回归、分割等&#xff09;而异。以下是一些常见的评价指标&#xff1a; 1. 分类任务 准确率&#xff08;Accuracy&#xff09; 定义&#xff1a;正确预测的样本数占总样本数的比例。 公式&#xff1a;AccuracyTPT…...

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪 里&#xff0c;但是照样可以链接成功&#…...

Django框架的全面指南:从入门到高级

Django框架的全面指南&#xff1a;从入门到高级 目录 引言Django简介安装与配置创建第一个Django项目Django的MVT架构模型&#xff08;Model&#xff09;视图&#xff08;View&#xff09;模板&#xff08;Template&#xff09;URL路由表单处理用户认证与权限Django Admin高级…...

C基础寒假练习(8)

一、终端输入10个学生成绩&#xff0c;使用冒泡排序对学生成绩从低到高排序 #include <stdio.h> int main(int argc, const char *argv[]) {int arr[10]; // 定义一个长度为10的整型数组&#xff0c;用于存储学生成绩int len sizeof(arr) / sizeof(arr[0]); // 计算数组…...

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…...

Rust 变量特性:不可变、和常量的区别、 Shadowing

Rust 变量特性&#xff1a;不可变、和常量的区别、 Shadowing Rust 是一门以安全性和性能著称的系统编程语言&#xff0c;其变量系统设计独特且强大。本文将从三个角度介绍 Rust 变量的核心特性&#xff1a;可变性&#xff08;Mutability&#xff09;、变量与常量的区别&#…...

基于Springboot框架的学术期刊遴选服务-项目演示

项目介绍 本课程演示的是一款 基于Javaweb的水果超市管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附…...

方法一:将私钥存入环境变量,环境变量指什么//spring中,rsa私钥应该怎么处置

环境变量&#xff08;Environment Variables&#xff09;是操作系统提供的一种机制&#xff0c;用于存储和传递配置信息或敏感数据&#xff08;如密钥、密码等&#xff09;。每个进程都可以访问一组环境变量&#xff0c;这些变量在操作系统级别定义&#xff0c;可以被应用程序读…...

React中useState()钩子和函数式组件底层渲染流程详解

useState()钩子底层渲染流程 React中useState的底层渲染机理。首先&#xff0c;我知道useState是React Hooks的一部分&#xff0c;用于在函数组件中添加状态。但底层是如何工作的呢&#xff1f;可能涉及到React的调度器、Fiber架构以及闭包等概念。 首先&#xff0c;React使用F…...

Cocos Creator 3.8 2D 游戏开发知识点整理

目录 Cocos Creator 3.8 2D 游戏开发知识点整理 1. Cocos Creator 3.8 概述 2. 2D 游戏核心组件 (1) 节点&#xff08;Node&#xff09;与组件&#xff08;Component&#xff09; (2) 渲染组件 (3) UI 组件 3. 动画系统 (1) 传统帧动画 (2) 动画编辑器 (3) Spine 和 …...

Java创建对象有几种方式?

大家好&#xff0c;我是锋哥。今天分享关于【Java创建对象有几种方式?】面试题。希望对大家有帮助&#xff1b; Java创建对象有几种方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Java 中&#xff0c;创建对象有几种常见的方式&#xff0c;具体如下&…...

R 字符串:深入理解与高效应用

R 字符串:深入理解与高效应用 引言 在R语言中,字符串是数据处理和编程中不可或缺的一部分。无论是数据清洗、数据转换还是数据分析,字符串的处理都是基础技能。本文将深入探讨R语言中的字符串概念,包括其基本操作、常见函数以及高效应用方法。 字符串基本概念 字符串定…...

基于Flask的全国星巴克门店可视化分析系统的设计与实现

【FLask】基于Flask的全国星巴克门店可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;结合Flask框架进行后端开发&…...