Reputation: 21314
I have the following code which works great returns a XElement
object from instance properties on the class:
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));
Problem is I want to introduce a collection via IList
for say MyClass3
and have no idea on how to get all of the items in the collection into my elements
array. So I want the following now:
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
};
I have tried using combinations of Select
and even changed IList
into List
just to see if .ForEach
would work and that didn't either. The error I'm getting is: "No best type found for implicitly typed array" regardless of the method I try.
How can I get all of the elements from my IList
property instance into the elements
array? Any help is appreciated, thanks!
EDIT: Order must be preserved (i.e. MyClass1, MyClass2, MyClass3), so If I introduce another element MyClass4
it must come after MyClass3
. The reasoning is because I'm composing a XML document with a specific structure.
Upvotes: 0
Views: 142
Reputation: 1502106
I suspect you want something like:
var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() }
.Concat(MyClass3.Select(x => x.GetXML())
.ToArray();
With MyClass4 after MyClass3:
var elements = new[] { MyClass1.GetXML(), MyClass2.GetXML() }
.Concat(MyClass3.Select(x => x.GetXML())
.Concat(new[] { MyClass4.GetXML() })
.ToArray();
Or putting the GetXML
in one place:
// Relies on covariance in .NET 4
var elements = new MyBase[] { MyClass1, MyClass2 }
.Concat(MyClass3)
.Concat(new[] { MyClass4 })
.Select(x => x.GetXML())
.ToArray();
Or without using LINQ at all until the end:
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();
Upvotes: 2