从字符串行到List <list>,拆分相同的值

时间:2016-04-08 17:00:58

标签: c# list

我编写静态方法,从文本文件中读取科学数字(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;
    }

在我写这个方法之前,它的工作很棒。但是现在当我写越来越多的代码时,我不知道发生了什么变化。我尝试修复但是......

与当地人的屏幕: https://onedrive.live.com/redir?resid=DF3242C9A565ECD1!4549&authkey=!AEDu90t1iNQj4MY&v=3&ithint=photo%2cpng

由于某种原因,double.clear()清除列表Lista的值。为什么呢?

4 个答案:

答案 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

因此,如果您在任何时候清除doublelowalista的所有元素都将指向相同的空列表。正如我上面所写,解决方案是让每个元素都是一个不同的列表,而不是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();