列表新手:每次迭代都会覆盖xml元素和域对象的列表

时间:2013-02-25 23:49:05

标签: c# c#-4.0 xml-parsing

我有两个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}
              :
              :

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分: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是仅存在于当前循环itteration 范围内的实例,一旦循环进入下一个循环,fA自动全新,就好像它从未存在过。

FooB.FooA_List是您要添加内容的列表实例。不断将此变量重新分配给列表实例的不同副本是没有意义的。因此,您无需在循环中使用FooB.FooA_List = whatever,因为您可以通过FooB.FooA_List直接访问该实例,并通过FooB.FooA_List.Add(whatever);

来完成您的工作

答案 1 :(得分: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;
}