0

次のように 2 つのドメイン クラスがあります。

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;

                                }

6 つの親アイテムと、それぞれ fA オブジェクトを含むそれぞれのサブ要素のリストを作成できます。ただし、forEach ブロックの反復ごとに、リストは新しい兄弟ノードの値で上書きされます。具体的には、

fooNodeElemValue.Add(fA);

FooB.FooA_List= fooNodeElemValue;

上書きされます。

したがって、ループが完了すると、各リスト要素が 6 倍に複製されます。

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 に答える