0

我有两个域类如下:

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;

被覆盖。

因此,当循环完成时,每个列表元素被复制 6x 所以,

FooB.FooA_List[0] = {DataA2, DataB2}

FooB.FooA_List[1] = {DataA2, DataB2}
              :
              :

非常感谢任何帮助。

谢谢!

4

2 回答 2

2

首先,您想在每次迭代中实例化一个新的 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);

于 2013-02-25T23:58:24.993 回答
0

我弄清楚了问题所在。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;
}
于 2013-02-26T13:14:35.027 回答