如何在C#中将文本框值与CSV匹配实现飞镖收尾得分查询?
飞镖计分程序收尾组合查询C#实现方案
前提确认
假设你的CSV结构为(第一行为列头,字段用逗号分隔):
Score,Dart1,Dart2,Dart3 170,T20,T20,BULL 160,T20,T20,T20 158,T20,T19,BULL ...
实现步骤
1. 定义数据模型类
创建与CSV列对应的实体类,方便后续数据处理:
public class DartFinish { public int Score { get; set; } public string Dart1 { get; set; } public string Dart2 { get; set; } public string Dart3 { get; set; } }
2. 加载并解析CSV文件
提供两种解析方案,按需选择:
方案A:使用原生TextFieldParser(推荐,支持复杂CSV格式)
需添加对Microsoft.VisualBasic程序集的引用:
using Microsoft.VisualBasic.FileIO; using System.Collections.Generic; using System.IO; public List<DartFinish> LoadDartFinishes(string csvPath) { var finishes = new List<DartFinish>(); using (var parser = new TextFieldParser(csvPath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // 处理带引号的字段 // 跳过列头行 parser.ReadFields(); while (!parser.EndOfData) { try { string[] fields = parser.ReadFields(); if (fields == null || fields.Length != 4) continue; finishes.Add(new DartFinish { Score = int.Parse(fields[0]), Dart1 = fields[1].Trim(), Dart2 = fields[2].Trim(), Dart3 = fields[3].Trim() }); } catch (MalformedLineException) { // 可添加日志记录无效行 } } } return finishes; }
方案B:手动分割解析(轻量,适用于无特殊格式的CSV)
using System.Collections.Generic; using System.IO; public List<DartFinish> LoadDartFinishesSimple(string csvPath) { var finishes = new List<DartFinish>(); var lines = File.ReadAllLines(csvPath); // 跳过第一行列头 for (int i = 1; i < lines.Length; i++) { string line = lines[i].Trim(); if (string.IsNullOrEmpty(line)) continue; string[] fields = line.Split(','); if (fields.Length != 4) continue; if (int.TryParse(fields[0], out int score)) { finishes.Add(new DartFinish { Score = score, Dart1 = fields[1].Trim(), Dart2 = fields[2].Trim(), Dart3 = fields[3].Trim() }); } } return finishes; }
3. 集成到GUI查询逻辑
在窗体加载时预加载CSV数据,查询时直接匹配输出:
using System.Linq; using System.Windows.Forms; private List<DartFinish> _dartFinishes; // 窗体加载事件 private void MainForm_Load(object sender, EventArgs e) { // 替换为你的CSV实际路径 string csvPath = @"C:\DartApp\dart_finishes.csv"; _dartFinishes = LoadDartFinishes(csvPath); } // 查询按钮点击事件 private void btnQuery_Click(object sender, EventArgs e) { // 读取输入框中的剩余得分(假设输入框名为txtRemainingScore) if (!int.TryParse(txtRemainingScore.Text, out int remainingScore)) { txtFinishResult.Text = "请输入有效数字"; return; } // 匹配对应得分的收尾组合 var targetFinish = _dartFinishes.FirstOrDefault(f => f.Score == remainingScore); if (targetFinish != null) { // 输出到结果文本框(假设文本框名为txtFinishResult) txtFinishResult.Text = $"{targetFinish.Dart1}, {targetFinish.Dart2}, {targetFinish.Dart3}"; } else { txtFinishResult.Text = "无匹配的收尾组合"; } }
常见问题排查
- 列识别错误:确认CSV列顺序与代码中
fields索引对应,或列头与模型属性匹配 - 数据崩溃:用
int.TryParse替代int.Parse,避免无效数值导致程序异常 - 性能问题:窗体加载时一次性加载所有数据,不要每次查询都读取CSV文件
- 路径问题:确保CSV文件路径正确,发布时可改用相对路径或嵌入资源
内容的提问来源于stack exchange,提问作者RISL2023
相关产品推荐
相关产品推荐

