我编写静态方法,从文本文件中读取科学数字(X,Y)并将其放入列表列表中。但我不知道为什么文件中的下一个值会覆盖所有其他值。
IF!= 100 - 100是文本文件的第一个值,也是我程序的唯一属性。
static List<List<double>> DownloadData(string path1)
{
List<List<double>> lista = new List<List<double>>();
List<double> doubelowa = new List<double>();
doubelowa.Clear();
string line = null;
try
{
using (TextReader sr = File.OpenText(path1))
{
while ((line = sr.ReadLine()) != null)
{
doubelowa.Clear();
if (line != "100")
{
var d = line.Split().Select(f => double.Parse(f, System.Globalization.NumberStyles.Float, CultureInfo.InvariantCulture));
doubelowa.AddRange(d);
lista.Add(doubelowa);
}
}
}
}
finally
{
}
return lista;
}
在我写这个方法之前,它的工作很棒。但是现在当我写越来越多的代码时,我不知道发生了什么变化。我尝试修复但是......
由于某种原因,double.clear()清除列表Lista的值。为什么呢?
答案 0 :(得分:4)
那是因为你一遍又一遍地添加同一个对象。如果您希望存储不同的List
,则需要在每次迭代时使用新的List
:
if (line != "100")
{
var d = line.Split().Select(f => double.Parse(f, System.Globalization.NumberStyles.Float, CultureInfo.InvariantCulture));
lista.Add(new List<double>(d));
}
如果你添加doubelowa
,你只是反复添加相同的引用(并且你在每次迭代时都会覆盖它)
使用屏幕截图进行编辑后
以防万一您的回答不明确...当您向doublelowa
添加lista
时,您每次都只是添加相同的列表。
所以lista
只是在每个元素上保持相同的对象:
lista[0]
指向doublelowa
lista[1]
指向doublelowa
lista[2]
指向doublelowa
因此,如果您在任何时候清除doublelowa
,lista
的所有元素都将指向相同的空列表。正如我上面所写,解决方案是让每个元素都是一个不同的列表,而不是doublelowa
,这可以通过我编写的代码实现(你可以忽略doublelowa
完全是因为它不再需要了。)
答案 1 :(得分:0)
我认为发生的事情是你只创建一个List对象,你将lista指向一遍又一遍。这样,通过改变doubelowa将它们全部改变,因为它们实际上都是同一个对象。要解决此问题,请尝试将doubelowa.Clear();
替换为doubelowa = new List<double>();
。
答案 2 :(得分:0)
Jcl感谢您的解释。我用幸运的尝试解决它,你可以在下面。但没有你我不认为有关参考文献。
这可能是因为引用是针对每个单元格而while循环完成后垃圾收集器没有清理?如果你想,请详细说明。
if (line != "100")
{
List<double> doubelowa = new List<double>();
doubelowa.AddRange(line.Split().Select(f => double.Parse(f, System.Globalization.NumberStyles.Float, CultureInfo.InvariantCulture)));
lista.Add(doubelowa);
}
答案 3 :(得分:0)
你也可以在分割线后通过IEnumerator的ToList方法创建新的列表。 使用Linq方法简化您的代码。 列表&gt; r = File.ReadAllLines(fileName).SkipWhile((line)=&gt; line ==“100”) 。选择((线){ line.Split()。选择(f =&gt; double.Parse(f,System.Globalization.NumberStyles.Float,CultureInfo.InvariantCulture))。ToList())。ToList();