List Newbie:xml元素和Domain对象的列表在每次迭代中都会不堪重负
本文关键字:迭代 不堪重负 列表 xml Newbie 元素 对象 Domain List | 更新日期: 2023-09-27 18:00:59
我有两个Domain类,如下所示:
Class FooA:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XXX.MyCore.Domain
{
public class FooA
{
public string String_FA { get; set; }
public string String_FB { get; set; }
}
}
Class FooB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XXX.MyCore.Domain
{
public class FooB
{
public string FooC{ get; set; }
public List<FooA> FooA_List { get; set; }
}
}
我的xml有如下重复节点(共6个(:
:
:
<ns2:Example>
<A>DataA1</A>
<B>DataB1</B>
</ns2:Example>
<ns2:Example>
<A>DataA2</A>
<B>DataB2</B>
</ns2:Example>
:
:
我有另一个引用这些域对象的类。
:
:
List<FooA> fooANodeElemValue = new List<FooA>();
FooA fA = new FooA();
// I now iterate through the XML elements to parse sibling values
foreach (XElement elem in document.Descendants().Elements(nsUsr + "ExampleA"))
{
fA.String_FA= elem.Element("A").Value;
fA.String_FB= elem.Element("B").Value;
fooNodeElemValue.Add(fA);
FooB.FooA_List= fooNodeElemValue;
}
我能够构建一个由六个父项和各自的子元素组成的列表,每个子元素都包含fA对象。但是,对于forEach块中的每次迭代,列表都会被新的同级节点值覆盖。具体而言,
fooNodeElemValue.Add(fA);
和
FooB.FooA_List= fooNodeElemValue;
被覆盖。
因此,当循环完成时,每个列表元素被复制6次所以,
FooB.FooA_List[0] = {DataA2, DataB2}
和
FooB.FooA_List[1] = {DataA2, DataB2}
:
:
任何帮助都将不胜感激。
谢谢!
首先,您希望在每个itteration中实例化一个新的FooA。其次,没有理由每次都重置列表,您可以使用现有的列表。尝试以下更改:
// Create a new list and assign it to the public property of FooB...
FooB.FooA_List = new List<FooA>();
foreach (XElement elem in document.Descendants().Elements(nsUsr + "ExampleA"))
{
// Create a temporary variable (in the scope of this loop iteration) to store my new FooA class instance...
FooA fA = new FooA() {
String_FA = elem.Element("A").Value,
String_FB = elem.Element("B").Value
};
// Because FooB.FooA_List is the list I want to add items to, I just access the public property directly.
FooB.FooA_List.Add(fA);
}
做一些事情,比如创建一个全新的列表,然后将该列表分配给FooA
的属性,只需要做很多额外的工作。fA
是一个仅存在于当前循环分配范围内的实例,一旦循环进入下一个循环,fA
就会自动全新,就好像它从未存在过一样。
FooB.FooA_List
是您正在添加内容的列表实例。不断将此变量重新分配给列表实例的其他副本是没有意义的。因此,不需要在循环中使用FooB.FooA_List = whatever
,因为您可以通过FooB.FooA_List
直接访问实例,并使其通过FooB.FooA_List.Add(whatever);
完成您的工作
我发现了问题所在。1.我需要在循环中实例化fA对象。2.我需要在循环中将fA对象设置为null。
foreach (XElement elem in document.Descendants().Elements(nsUsr + "ExampleA"))
{
FooA fA = new FooA();
fA.String_FA= elem.Element("A").Value;
fA.String_FB= elem.Element("B").Value;
fooNodeElemValue.Add(fA);
FooB.FooA_List= fooNodeElemValue;
fA =null;
}