我使用 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;
}
更多信息:这是一种简化版本,没有 id 对 xml 做的所有花哨的东西,但问题是一样的。 每次我检查时,paper 列表都很好,所以问题应该出在添加到paper 上。老实说,我不知道它为什么甚至如何删除论文的内容并自己添加相同的值。
最佳答案
问题是你只调用了 paper.Clear
,它会清除您刚刚添加的列表,但随后您会用新项目重新填充它并再次添加它。
相反,您应该在每次迭代时创建一个列表的新实例,这样您就不会总是一遍又一遍地修改同一个列表(记住 List<T>
是一个引用类型,所以你只是在 list
中添加了一个引用。
例如:
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;
}
另外,使用 System.Linq
扩展方法,您的代码可以简化为:
static List<List<string>> GetChildrenInnerTexts(XmlNodeList nodes)
{
return nodes.Cast<XmlNode>()
.Select(node => node.ChildNodes.Cast<XmlNode>()
.Select(child => child.InnerText)
.ToList())
.ToList();
}
关于C# - 在字符串列表列表中重复而不是正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59313299/