2013-02-08 84 views
0

我有下面的代碼從實例屬性的類的偉大工程回報XElement對象:如何在構建項目數組時獲取集合中的所有元素?

public MyClass1 MyClass1 {get; set;} 
public MyClass2 MyClass2 {get; set;} 

var elements = new[] 
{ 
    //Calls to .GetXML() return an XElement instance 
    this.MyClass1.GetXML(), 
    this.MyClass2.GetXML() 
}; 

return new XElement("Root", 
    elements.Where(el => el != null && !el.IsEmpty)); 

問題是,我想通過IList引入集合發言權MyClass3並就如何讓所有不知道將收藏品中的物品放入我的elements陣列中。所以現在我想以下幾點:

public MyClass1 MyClass1 {get; set;} 
public MyClass2 MyClass2 {get; set;} 
public IList<MyClass3> MyClass3 {get; set;} 

var elements = new[] 
{ 
    this.MyClass1.GetXML(), 
    this.MyClass2.GetXML(), 
    this.MyClass3.ToList().Select(x => x.GetXML()) //Not working 
}; 

我一直在使用的Select組合嘗試甚至改變IListList只是爲了看看.ForEach會工作,並且做了沒有。我得到的錯誤是:「沒有找到隱式類型數組的最佳類型」,無論我嘗試的方法如何。

如何將我的IList屬性實例中的所有元素轉換爲elements數組?任何幫助表示讚賞,謝謝!

編輯:訂購必須被保留(即MyClass1的,MyClass2,MyClass3),所以如果我介紹另一個元素MyClass4它必須來MyClass3後。推理是因爲我正在編寫一個具有特定結構的XML文檔。

回答

2

我懷疑你想要的東西,如:

var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() } 
     .Concat(MyClass3.Select(x => x.GetXML()) 
     .ToArray(); 

隨着MyClass4 MyClass3後:

var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() } 
     .Concat(MyClass3.Select(x => x.GetXML()) 
     .Concat(new[] { MyClass4.GetXML() }) 
     .ToArray(); 

或者把一個GetXML地方:

// Relies on covariance in .NET 4 
var elements = new MyBase[] { MyClass1, MyClass2 } 
    .Concat(MyClass3) 
    .Concat(new[] { MyClass4 }) 
    .Select(x => x.GetXML()) 
    .ToArray(); 

使用或不使用LINQ在全部直到結束:

var items = new List<BaseClass>(); 
items.Add(MyClass1); 
items.Add(MyClass2); 
items.AddRange(MyClass3); 
items.Add(MyClass4); 
var elemets = items.Select(x => x.GetXML()).ToArray(); 
+0

我應該提到(編輯的OP),因爲我正在撰寫XML,訂單很重要。如果我按順序介紹'MyClass4'和'MyClass3'必須先來嗎?如果我使用'.Concat',那麼如果放在原始數組中,'MyClass4'會出現在MyClass3之前。有沒有辦法確保訂單得到保留? – atconway 2013-02-08 14:10:10

+0

@atconway:在這種情況下,你需要在具有MyClass3的'Concat'之後另一個'Concat'與另一個數組* *。當然,另一種選擇是不使用LINQ:只需創建一個'List ',併爲每個想要的項目調用Add或AddRange。 – 2013-02-08 14:13:37

+0

有趣但不確定我該怎麼做。我的'GetXML'方法是在基類中定義的,它規定了'XElement'的返回類型,所以我不能改變返回類型'List '。此外,我不必使用LINQ,所以如果還有其他方法,我也可以使用。 – atconway 2013-02-08 14:21:08

相關問題