You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:55:23