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

C# WPF中自定义类List<>导入文本数据后属性值全为0的问题

问题:读取文件封装对象时所有属性值均为0

我有一个内容格式为34;233;1的文本文件,同时定义了包含X、Y、i属性的my_points类。我想要逐行读取文件,将每行数据封装为my_points对象并添加到已声明的List<my_points>中。

目前代码没有语法错误,List的元素数量和文件行数一致,分割后的字符串也能正确获取数值,但所有my_points对象的属性值全是0,不知道原因。

我的代码如下:

List<my_points> my_point_list_read = new List<my_points>();
// 列表已提前初始化...

public List<my_points> FiletoList()
{
    System.IO.StreamReader my_streamreader = new System.IO.StreamReader("Textfile.txt");
    string my_line;
    while ((my_line = my_streamreader.ReadLine()) != null)
    {
        try
        {
            string[] seperated = my_line.Split(';');
            my_point_list_read.Add(new my_points(Convert.ToDouble(seperated[0]), Convert.ToDouble(seperated[1]), Convert.ToInt32(seperated[2])));
            
        }
        catch 
        {
            break;
        }  
    }
}

// 自定义my_points类:
public class my_points
{
    public double X;
    public double Y;
    public int i;
    public my_points(double X, double Y, int i)
    {
        this.X = 0.0;
        this.Y = 0.0;
        this.i = 0;
    }
}

问题原因

问题出在my_points类的构造函数里:你没有把构造函数接收的参数赋值给类的成员属性,而是直接将属性硬编码设置为0,不管传入什么参数,最终对象的属性都会是0。

修复方案

修改my_points的构造函数,将传入的参数赋值给类的属性:

public class my_points
{
    public double X;
    public double Y;
    public int i;
    public my_points(double X, double Y, int i)
    {
        // 把参数赋值给类的成员属性
        this.X = X;
        this.Y = Y;
        this.i = i;
    }
}

额外优化建议

  • 使用using语句自动释放StreamReader资源,避免内存泄漏:
public List<my_points> FiletoList()
{
    using (System.IO.StreamReader my_streamreader = new System.IO.StreamReader("Textfile.txt"))
    {
        string my_line;
        while ((my_line = my_streamreader.ReadLine()) != null)
        {
            try
            {
                string[] seperated = my_line.Split(';');
                my_point_list_read.Add(new my_points(Convert.ToDouble(seperated[0]), Convert.ToDouble(seperated[1]), Convert.ToInt32(seperated[2])));
            }
            catch (Exception ex)
            {
                // 不建议直接break,可记录异常后继续处理下一行
                Console.WriteLine($"处理行时出错:{ex.Message}");
                // continue; // 保留此行可跳过错误行,继续处理后续内容
            }  
        }
    }
    return my_point_list_read; // 原方法缺少返回语句,需要补充
}
  • 原FiletoList方法没有返回值,需要补充return my_point_list_read;才能符合方法签名的要求。
  • catch块建议捕获具体异常类型并做日志记录,而不是直接break,避免因为某一行错误导致整个读取流程中断。

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:51:07