Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Aggregate multiple arrays into one array (Linq)

Tags:

.net

linq

c#-3.0

I'm having trouble aggregating multiple arrays into one "big array", I think this should be possible in Linq but I can't get my head around it :(

consider some method which returns an array of some dummyObjects

public class DummyObjectReceiver 
{
  public DummyObject[] GetDummyObjects  { -snip- }
}

now somewhere I have this:

public class Temp
{
  public List<DummyObjectReceiver> { get; set; }

  public DummyObject[] GetAllDummyObjects ()
  {
    //here's where I'm struggling (in linq) - no problem doing it using foreach'es... ;)
  }
}

hope it's somewhat clear what I'm trying to achieve (as extra I want to order this array by an int value the DummyObject has... - but the orderby should be no problem,... I hope ;)

like image 263
Bluenuance Avatar asked Apr 23 '09 10:04

Bluenuance


1 Answers

You use the SelectMany method to flatten the list of array returning objects into an array.

public class DummyObject {
    public string Name;
    public int Value;
}

public class DummyObjectReceiver  {

    public DummyObject[] GetDummyObjects()  {
        return new DummyObject[] {
            new DummyObject() { Name = "a", Value = 1 },
            new DummyObject() { Name = "b", Value = 2 }
        };
    }

}

public class Temp {

    public List<DummyObjectReceiver> Receivers { get; set; }

    public DummyObject[] GetAllDummyObjects() {
        return Receivers.SelectMany(r => r.GetDummyObjects()).OrderBy(d => d.Value).ToArray();
    }

}

Example:

Temp temp = new Temp();
temp.Receivers = new List<DummyObjectReceiver>();
temp.Receivers.Add(new DummyObjectReceiver());
temp.Receivers.Add(new DummyObjectReceiver());
temp.Receivers.Add(new DummyObjectReceiver());

DummyObject[] result = temp.GetAllDummyObjects();
like image 153
Guffa Avatar answered Sep 30 '22 19:09

Guffa