C#中List.Add()仅添加最后一行数组的问题求助
问题原因
你在循环外仅创建了一个float[]数组实例,而数组属于引用类型——每次循环只是修改这个数组内部的元素值,然后将同一个数组的引用添加到List中。List中所有元素本质上都指向内存中同一个数组对象,因此最终所有元素都会显示最后一次修改后的数组内容。
解决方法
有两种常用的修复方式:
方式一:循环内创建新数组实例
将数组的创建逻辑移到while循环内部,每次循环都生成一个全新的float[]数组,确保添加到List的是不同的数组引用:
string filename = @"D:\TestFiles\floats.bin"; List<float[]> field_array = new List<float[]>(); string[] field_array_row; Console.WriteLine("Individual parsed rows:"); using (StreamReader parser = new StreamReader(filename)) { string line; while((line = parser.ReadLine()) != null) { // 每次循环新建数组实例 float[] field_float_num = new float[3]; field_array_row = line.Split(','); for(int i = 0; i < 3; i++) { // 加Trim()处理数据中的空格,避免解析失败 field_float_num[i] = float.Parse(field_array_row[i].Trim()); } Console.WriteLine(string.Join(",",field_float_num)); field_array.Add(field_float_num); } } Console.WriteLine("\nfield_array Output:"); foreach (float[] x in field_array) { Console.WriteLine(string.Join(",", x)); }
方式二:添加数组的副本到List
如果需要保留循环外的数组声明,可以在添加时创建当前数组的副本,避免添加原数组的引用:
// 其他代码不变,仅修改Add这一行 field_array.Add((float[])field_float_num.Clone());
另外补充:原代码中CSV数据的逗号后带有空格,直接float.Parse可能会触发格式错误,建议添加Trim()去除字符串两端的空白字符。
内容的提问来源于stack exchange,提问作者Rohit Chaoji
相关产品推荐
相关产品推荐

