C# 从字符串行到列表<;列表>;使用相同的值进行拆分
我编写了一种静态方法,从文本文件中读取科学数字(X,Y),并将其放入列表中。但我不知道为什么文件中的下一个值会覆盖所有其他值 如果!=100-100是文本文件的第一个值,也是我的程序的唯一属性C# 从字符串行到列表<;列表>;使用相同的值进行拆分,c#,list,C#,List,我编写了一种静态方法,从文本文件中读取科学数字(X,Y),并将其放入列表中。但我不知道为什么文件中的下一个值会覆盖所有其他值 如果!=100-100是文本文件的第一个值,也是我的程序的唯一属性 static List<List<double>> DownloadData(string path1) { List<List<double>> lista = new List<List<double>>
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;
}
静态列表下载数据(字符串路径1)
{
List lista=新列表();
List doubelowa=新列表();
doubelowa.Clear();
字符串行=null;
尝试
{
使用(TextReader sr=File.OpenText(路径1))
{
而((line=sr.ReadLine())!=null)
{
doubelowa.Clear();
如果(行!=“100”)
{
var d=line.Split().Select(f=>double.Parse(f,System.Globalization.NumberStyles.Float,CultureInfo.InvariantCulture));
杜贝洛瓦.阿德兰奇(d);
添加(杜贝洛瓦);
}
}
}
}
最后
{
}
返回列表a;
}
在我写这个方法之前,它的工作很棒。但是现在当我写越来越多的代码时,我不知道发生了什么变化。我试着把它修好,但是
它的屏幕上显示了当地人:
出于某种原因,double.clear()清除list Lista的值。为什么?那是因为你在一次又一次地添加同一个对象。如果希望存储不同的
列表
s,则需要在每次迭代中使用新的列表
:
if (line != "100")
{
var d = line.Split().Select(f => double.Parse(f, System.Globalization.NumberStyles.Float, CultureInfo.InvariantCulture));
lista.Add(new List<double>(d));
}
if(行!=“100”)
{
var d=line.Split().Select(f=>double.Parse(f,System.Globalization.NumberStyles.Float,CultureInfo.InvariantCulture));
添加(新列表(d));
}
如果您添加doubelowa
,您只是在一次又一次地添加相同的引用(并且在每次迭代中都会覆盖它)
使用屏幕截图进行编辑后 以防你不清楚答案。。。当您将
doublelowa
添加到lista
时,您每次只需添加相同的列表
因此,lista
只是在每个元素上保持相同的对象:
指向lista[0]
doublelowa
指向lista[1]
doublelowa
指向lista[2]
doublelowa
- 等等
因此,如果在任意点清除
doublelowa
,则lista
的所有元素都将指向相同的空列表。正如我在上面所写的,解决方案是让每个元素都是一个不同的列表,而不是可以通过我写的代码实现的doublelowa
(你可以完全忽略doublelowa
,因为它不再需要了)。这是因为你反复添加同一个对象。如果希望存储不同的列表
s,则需要在每次迭代中使用新的列表
:
if (line != "100")
{
var d = line.Split().Select(f => double.Parse(f, System.Globalization.NumberStyles.Float, CultureInfo.InvariantCulture));
lista.Add(new List<double>(d));
}
if(行!=“100”)
{
var d=line.Split().Select(f=>double.Parse(f,System.Globalization.NumberStyles.Float,CultureInfo.InvariantCulture));
添加(新列表(d));
}
如果您添加doubelowa
,您只是在一次又一次地添加相同的引用(并且在每次迭代中都会覆盖它)
使用屏幕截图进行编辑后 以防你不清楚答案。。。当您将
doublelowa
添加到lista
时,您每次只需添加相同的列表
因此,lista
只是在每个元素上保持相同的对象:
指向lista[0]
doublelowa
指向lista[1]
doublelowa
指向lista[2]
doublelowa
- 等等
因此,如果在任意点清除
doublelowa
,则lista
的所有元素都将指向相同的空列表。正如我上面所写的,解决方案是让每个元素都是一个不同的列表,而不是我写的代码可以实现的doublelowa
(你可以完全忽略doublelowa
,因为它不再需要了)。我相信现在发生的事情是,你只需要创建一个列表对象,你一次又一次地强调这一点。这样,通过更改doubelowa可以更改所有对象,因为它们实际上都是同一个对象。要更正此问题,请尝试替换doubelowa.Clear()代码>带有doubelowa=新列表()代码>我相信现在发生的事情是,您只创建了一个列表对象,您将列表一次又一次指向它。这样,通过更改doubelowa可以更改所有对象,因为它们实际上都是同一个对象。要更正此问题,请尝试替换doubelowa.Clear()代码>带有doubelowa=新列表()代码>Jcl感谢您的解释。我用幸运的办法修复它,你可以在下面看到。但是如果没有你,我不认为那是关于推荐人的
发生这种情况可能是因为引用是针对每个单元格的,而循环完成时垃圾收集器没有清理?如果你愿意的话,请给我详细解释一下
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);
}
if(行!=“100”)
{
List doubelowa=新列表();
AddRange(line.Split().Select(f=>double.Parse(f,System.Globalization.NumberStyles.Float,CultureInfo.InvariantCulture));
添加(杜贝洛瓦);
}
Jcl感谢您的解释。我用幸运的办法修复它,你可以在下面看到。但是如果没有你,我不认为那是关于推荐人的
发生这种情况可能是因为引用是针对每个单元格的,而循环完成时垃圾收集器没有清理?如果你愿意的话,请给我详细解释一下
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);
}
if(行!=“100”)
{
List doubelowa=新列表(