如何将CSV读取的dinner_meal与dinner_price数组并排填充到ListBox
解决ListBox并排显示餐品与价格的问题
先修正现有代码的路径问题
你当前代码里的路径"..\Debug\Dinner.csv"存在转义字符问题,\D会被解析为转义序列导致路径错误,需要改成:
dinner = @"..\Debug\Dinner.csv"; // 或者用双反斜杠写法:"..\\Debug\\Dinner.csv"
方案1:字符串拼接对齐(快速实现)
在Dinner_Load事件中,遍历两个集合,将餐品和价格拼接成对齐的字符串后添加到ListBox。用PadRight固定餐品名称的宽度,确保价格能整齐排列:
private void Dinner_Load(object sender, EventArgs e) { // 遍历两个集合,需确保二者长度一致 for (int i = 0; i < dinner_meal.Count; i++) { // PadRight的数值可根据餐品名称的最长长度调整,保证价格列对齐 string itemText = dinner_meal[i].PadRight(20) + dinner_price[i]; lbDinner.Items.Add(itemText); } }
方案2:自定义实体类(更规范,便于后续扩展)
如果后续需要直接获取选中项的餐品和价格(而非拆分字符串),建议定义实体类并通过重写ToString控制显示格式:
- 定义餐品实体类:
public class DinnerItem { public string Meal { get; set; } public string Price { get; set; } // 重写ToString方法,自定义显示格式 public override string ToString() { return $"{Meal.PadRight(20)}{Price}"; } }
- 修改CSV读取逻辑,直接存入实体类集合:
// 替换原来的两个List,改用实体类集合 List<DinnerItem> dinnerItems = new List<DinnerItem>(); public Dinner() { InitializeComponent(); dinner = @"..\Debug\Dinner.csv"; // 使用using自动释放StreamReader资源 using (var dinner_reader = new StreamReader(dinner)) { while (!dinner_reader.EndOfStream) { var line = dinner_reader.ReadLine(); if (string.IsNullOrWhiteSpace(line)) continue; // 跳过空行 var values = line.Split(','); if (values.Length >= 2) // 避免异常行导致索引越界 { dinnerItems.Add(new DinnerItem { Meal = values[0].Trim(), Price = values[1].Trim() }); } } } }
- 在
Dinner_Load中绑定集合:
private void Dinner_Load(object sender, EventArgs e) { lbDinner.DataSource = dinnerItems; }
额外优化建议
- 读取文件时使用
using语句,确保资源自动释放,避免内存泄漏。 - 添加空行和格式校验,防止CSV中存在异常行导致程序崩溃。
内容的提问来源于stack exchange,提问作者johno_tries
相关产品推荐
相关产品推荐

