2010-11-02 102 views
0

假設我有一個名爲Woah的結構體。 Woah有一個字段存儲下面的值SomeChild的值,但也包含一個List<Woah>以包含其他Woah結構。我讀了XML的結構爲:如何動態添加到使用LINQ列表嵌套節點的列表?

<WoahWrapper> 
    <Woahs> 
    <WoahNode> 
     <SomeChild /> 
     <SubWoahs> 
     <WoahNode /> 
     </SubWoahs> 
    </WoahNode> 
    </Woahs> 
</WoahWrapper> 

所以我在這裏可以指定SomeChild到一個struct我在創造我的LINQ「選擇新的」,但有什麼辦法,我可以很容易地初始化該列表我的結構,並添加到SubWoahs存在的所有WoahNode

var list = (from c in mapData.Root.Element("Woahs").Elements("WoahNode") 
        select new Woah() 
        { 
         somechild = Convert.ToInt32(c.Element("SomeChild").Value), 
         //If there are Woahs in SubWoahs, initialize list in struct and add each Woah SubWoahs to that list 
        }); 

回答

1

首先,DTOs使糟糕的結構;結構應該是值(不是實體),不可變的,而且很小。你的哇是沒有這些。它應該是一個班級。

這裏

一種方法可能是一個遞歸函數,這對於邏輯,你可以小位(如果您選擇)重新寫爲匿名方法:

var mapData = XDocument.Parse(xml); 

Func<XElement, Woah> builder = null; 
builder = c => { 
    var woah = new Woah { SomeChild = (int)c.Element("SomeChild") }; 
    foreach(var sub in c.Elements("SubWoahs").Elements("WoahNode")) 
     woah.Children.Add(builder(sub)); 
    return woah; 
}; 
var list = (from c in mapData.Root.Element("Woahs").Elements("WoahNode") 
      select builder(c)).ToList(); 

然而,個人我認爲XmlSerializer會在這裏簡單...

XmlSerializer ser = new XmlSerializer(typeof(WoahWrapper)); 
var list = ((WoahWrapper)ser.Deserialize(new StringReader(xml))).Woahs; 

與類型:

public class WoahWrapper 
{ 
    private List<Woah> woahs = new List<Woah>(); 
    [XmlArray("Woahs"), XmlArrayItem("WoahNode")] 
    public List<Woah> Woahs { get { return woahs; } } 
} 
public class Woah 
{ 
    public int SomeChild { get; set; } 
    private List<Woah> children; 
    [XmlArray("SubWoahs"), XmlArrayItem("WoahNode")] 
    public List<Woah> Children { get { return children ?? (
     children = new List<Woah>()); } } 
} 
+0

謝謝。是的,我知道結構。我最初做了一些,因爲我正在處理創建大量對象,所以主要是爲了搞亂和測試。謝謝 – Ilya 2010-11-02 07:25:53