Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq - merging sub lists from different objects into a single object

Tags:

c#

linq

I have an object which has a date and a list of people, a person has a first and last name. Something like:

PeopleInfo
----------
DateTime - StartDate
List<Person> - People

Person
------
string - FirstName
string - LastName

I have a list of people info where there are multiple StartDates the same each with its own list of people. Is it possible to merge these into a single object using linq?

Example

StartDate - 1/1/2011, People Bob, Sue, Jane
StartDate - 2/2/2011, People Scott, Rob, Mark
StartDate - 1/1/2011, People Fred, Gill, Jack

Expected output

StartDate - 1/1/2011, People Bob, Sue, Jane, Fred, Gill, Jack
StartDate - 2/2/2011, People Scott, Rob, Mark

Is this possible in linq?

Thanks

like image 806
lancscoder Avatar asked Feb 11 '11 12:02

lancscoder


1 Answers

You could do:

List<PeopleInfo> peopleInfos = ...

var merged = from peopleInfo in peopleInfos
             group peopleInfo by peopleInfo.StartDate into dateGroup
             select new PeopleInfo
             {
                 StartDate = dateGroup.Key,
                 People = dateGroup.SelectMany(pi => pi.People)
                                   .Distinct()
                                   .ToList()
             };

But this really looks like a hack; I would recommend you design the container class in a way that prevents this 'duplicate date' scenario from occurring in the first place. e.g. an implementation of ILookup<DateTime, Person> or IDictionary<DateTime, List<Person>> or a HashSet<PeopleInfo> that uses StartDate for equality.

like image 55
Ani Avatar answered Oct 20 '22 01:10

Ani