VB.NET中从二维数组提取指定文件生成新列表用于XY图表
解决方案
一、现有代码核心问题
- 重复读取CSV文件,既冗余又影响效率
- 完全缺失针对
testtesttest.D000条目的筛选逻辑 - AxisX是图表渲染控件,无法直接帮你筛选数据——数据筛选必须先在业务逻辑层完成,再通过AxisX做标记
二、简化实现步骤
1. 一次性完成数据读取与筛选
直接读取原CSV文件,同时筛选出目标条目并生成所需的List(Of String),避免重复IO操作:
' 读取CSV并筛选testtesttest.D000条目 Dim csvLines = File.ReadAllLines("R:PathTooriginalFile.csv") Dim targetDateList As New List(Of String)() ' 初始化二维数组(需根据CSV实际行列数调整,示例假设已知列数为50) Dim myarray(csvLines.Length - 1, 49) As String ' 跳过表头(如果CSV有表头,从第2行开始遍历) For x = 1 To csvLines.Length - 1 Dim splits = csvLines(x).Split(","c) ' 假设testtesttest.D000在第6列(索引为5,需根据实际CSV结构调整) If splits(5) = "testtesttest.D000" Then ' 提取对应日期(假设日期在第4列,索引为3)加入目标列表 targetDateList.Add(splits(3)) End If ' 同步填充二维数组 For y = 0 To splits.Length - 1 myarray(x, y) = splits(y) Next Next
2. 用AxisX标记目标位置
数据筛选完成后,通过AxisX的自定义网格线或标签标记目标条目:
' 图表基础配置 ChartName.Titles.Add("Name Of Chart") ChartName.ChartAreas.Clear() Dim chartArea = ChartName.ChartAreas.Add("Default") With chartArea .AxisX.Title = "Date" .AxisY.Title = "Counts" .AxisX.MajorGrid.LineColor = Color.Red .AxisY.MajorGrid.LineColor = Color.Orange .AxisY.IsLogarithmic = True End With ' 配置系列样式 ChartName.Series.Clear() Dim cr1Series = ChartName.Series.Add("CR1") cr1Series.Color = Color.DarkTurquoise cr1Series.BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Dot cr1Series.BorderWidth = 4 cr1Series.ChartType = DataVisualization.Charting.SeriesChartType.Point ' 绑定原始数据点 For i = 0 To GrossCR1Values.Count - 1 Dim xVal = DateOfTheFileValues(i) Dim yVal = GrossCR1Values(i) If yVal = 0 Then yVal = 1 cr1Series.Points.AddXY(xVal, yVal) Next ' 在AxisX上标记目标条目位置 For Each targetDate In targetDateList Dim pointIndex = DateOfTheFileValues.IndexOf(targetDate) If pointIndex <> -1 Then ' 添加蓝色加粗自定义网格线 Dim customGrid = New DataVisualization.Charting.GridLine() customGrid.LineColor = Color.Blue customGrid.LineWidth = 2 customGrid.IntervalOffset = pointIndex chartArea.AxisX.MajorGrid.CustomGridLines.Add(customGrid) ' 可选:添加目标标签 Dim customLabel = New DataVisualization.Charting.CustomLabel() customLabel.Text = "Target" customLabel.FromPosition = pointIndex - 0.5 customLabel.ToPosition = pointIndex + 0.5 chartArea.AxisX.CustomLabels.Add(customLabel) End If Next
三、关键说明
- AxisX只负责图表渲染,数据筛选必须提前完成,不要指望控件帮你处理业务逻辑
- 代码中的列索引(比如
splits(5)、splits(3))要严格对应你的CSV实际结构,需自行调整 - 优化后的代码去掉了重复读取文件的操作,性能更优
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

