Sunday, May 1, 2011

Aggregate multiple arrays into one array (Linq)

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 ;)

From stackoverflow
  • 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();
    
    AnthonyWJones : +1. I missed the "multiple" aspect in my now deleted answer.
    Calamitous : exactly what I was looking for :) extra thanks for including orderby! (still can only +1)

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.