Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-在字符串列表列表中重复,而不是正确的值_C#_.net_Xml - Fatal编程技术网

C# C-在字符串列表列表中重复,而不是正确的值

C# C-在字符串列表列表中重复,而不是正确的值,c#,.net,xml,C#,.net,Xml,我使用foreach读取xml文件,如下所示,并将找到的信息写入一个列表,然后再添加到列表列表中。我的问题是,当foreach循环试图向列表中添加另一个元素时,它会以某种方式删除列表中以前元素的内容,而不是添加相同元素的x。例如,第一个循环正常,第二个循环删除第一个元素并添加2个相同的元素,第三个循环添加3个相同的列表等。 这可能是一个简单的问题,但我现在真的想不出解决的办法 代码: static List<List<string>> AddPapers(XmlNodeL

我使用foreach读取xml文件,如下所示,并将找到的信息写入一个列表,然后再添加到列表列表中。我的问题是,当foreach循环试图向列表中添加另一个元素时,它会以某种方式删除列表中以前元素的内容,而不是添加相同元素的x。例如,第一个循环正常,第二个循环删除第一个元素并添加2个相同的元素,第三个循环添加3个相同的列表等。 这可能是一个简单的问题,但我现在真的想不出解决的办法

代码:

static List<List<string>> AddPapers(XmlNodeList nodelist)
    {
        var papers = new List<List<string>>();
        var paper = new List<string>();

        foreach (XmlNode node in nodelist)
        {
            paper.Clear();
            for (int i = 0; i < node.ChildNodes.Count; i++)
            {
                    paper.Add(node.ChildNodes[i].InnerText);
            }
            papers.Add(paper);
        }
        return papers;
    }
更多信息:这是一个简化的版本,没有使用xml所做的所有花哨的事情,但是问题是一样的。
每次我检查时,论文列表都很好,所以问题应该是添加到论文中。我真的不知道为什么,甚至不知道它如何能够删除论文的内容,并自行添加相同的值。

问题是,您只调用paper.Clear,它会清除您刚才添加的列表,但随后您会用新项目重新填充它并再次添加它

相反,您应该在每次迭代中创建列表的新实例,这样您就不会总是反复修改同一个列表。请记住,列表是引用类型,因此您只需向列表添加引用

例如:

static List<List<string>> AddPapers(XmlNodeList nodelist)
{
    var papers = new List<List<string>>();        

    foreach (XmlNode node in nodelist)
    {
        // Create a new list on each iteration
        var paper = new List<string>();

        for (int i = 0; i < node.ChildNodes.Count; i++)
        {
            paper.Add(node.ChildNodes[i].InnerText);
        }

        papers.Add(paper);
    }

    return papers;
}

问题是您只调用paper.Clear,它会清除您刚才添加的列表,但随后您会使用新项目重新填充该列表并再次添加

相反,您应该在每次迭代中创建列表的新实例,这样您就不会总是反复修改同一个列表。请记住,列表是引用类型,因此您只需向列表添加引用

例如:

static List<List<string>> AddPapers(XmlNodeList nodelist)
{
    var papers = new List<List<string>>();        

    foreach (XmlNode node in nodelist)
    {
        // Create a new list on each iteration
        var paper = new List<string>();

        for (int i = 0; i < node.ChildNodes.Count; i++)
        {
            paper.Add(node.ChildNodes[i].InnerText);
        }

        papers.Add(paper);
    }

    return papers;
}

这个问题与参考有关。您需要初始化“纸张”,而不是清除它

在您的第一个foreach循环中,更改

纸,没问题

纸张=新列表


当您清除对象时,您将为每个论文索引保留对空对象的引用

该问题与引用有关。您需要初始化“纸张”,而不是清除它

在您的第一个foreach循环中,更改

纸,没问题

纸张=新列表


当您清除对象时,您将为每个论文索引保留对空对象的引用

这不是答案,但列表具有删除方法。你看到了吗?也许你会在这种情况下使用它。也许可以尝试通过使用paper.ToArray将纸张转换为数组并添加范围来向纸张添加纸张。我认为问题在于,您正在通过引用添加到论文中,然后清除列表,尽管我不是100%确定。您是否必须使用list.addRangeList添加到初始列表?如果您可以更改为IEnumerable nodelist,则可以这样做:返回nodelist.Selectn=>n.Elements.Selectx=>x.Value.ToList.ToList;。这不是答案,但列表具有删除方法。你看到了吗?也许你会在这种情况下使用它。也许可以尝试通过使用paper.ToArray将纸张转换为数组并添加范围来向纸张添加纸张。我认为问题在于,您正在通过引用添加到论文中,然后清除列表,尽管我不是100%确定。您是否必须使用list.addRangeList添加到初始列表?如果您可以更改为IEnumerable nodelist,则可以这样做:返回nodelist.Selectn=>n.Elements.Selectx=>x.Value.ToList.ToList;。很高兴看到我几乎走对了路线。C关于引用类型的不明确性有时会让人恼火。现在可以了,谢谢。我怀疑我错过了一些简单的事情。很高兴看到我几乎走对了路线。C关于引用类型的不明确性有时会让人恼火。现在可以了,谢谢。我怀疑我错过了一些简单的事情。