atconway
atconway

Reputation: 21314

How to get all elements in collection when building an array of items?

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

Answers (1)

Jon Skeet
Jon Skeet

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

Related Questions