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