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}
              :
              :

任何帮助都将不胜感激。

谢谢!

List Newbie:xml元素和Domain对象的列表在每次迭代中都会不堪重负

首先,您希望在每个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;
}