user3021830
user3021830

Reputation: 2924

Flatten a list which one of its properties is another list of object

I have the following classes:

public class Owner
{
    public string Id { get; set; }
    public string Name { get; set; }
}
public class Main
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<Owner> Owners { get; set; }
}

I want to convert List<Main> to List<FlatList> where FlatList is

public class FlatList
{
        public string Id { get; set; }          // Id from Main
        public string Name { get; set; }        // Name from Main
        public string OwnerId { get; set; }     // Id from each Owner in a Main's Owner
        public string OwnerName { get; set; }   // Name from each Owner in a Main's Owner
}

Unfortunately I haven't been able to figure out the LinQ query to perform this operation.

Upvotes: 9

Views: 2653

Answers (3)

Zein Makki
Zein Makki

Reputation: 30022

You can do that using linq (secret looping behind the scenes):

from m in mainList
from o in m.Owners
select new FlatList
{
   Id  = m.Id,
   Name = m.Name,
   OwnerId = o.OwnerId ,
   OwnerName = o.OwnerName 
};

Upvotes: 2

Marc Gravell
Marc Gravell

Reputation: 1062745

List<Main> mainList = ...
var flatList = (
    from main in mainList
    from owner in main.Owners
    select new FlatList {
        Id = main.Id, Name = main.Name,
        OwnerId = owner.Id, OwnerName = owner.Name
    }).ToList();

Upvotes: 4

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236208

You should use SelectMany to flatten a sequence of Main objects:

Projects each element of a sequence to an IEnumerable and flattens the resulting sequences into one sequence.

So it projects each Main object into sequence of FlatList objects and then flattens resulting sequences into one FlatList sequence

var flatList = mainList.SelectMany(m => 
    m.Owners.Select(o => 
        new FlatList { 
              Id = m.Id, 
              Name = m.Name, 
              OwnerId = o.Id,
              OwnerName = o.Name
         })).ToList()

Upvotes: 12

Related Questions