开发者

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

开发者 https://www.devze.com 2023-02-10 10:37 出处:网络
I have an object which has a date and a list of people, a person has a first and last name. Something like:

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开发者_StackOverflow - 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


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.


ILookup<DateTime, Person> lookup =
  (
    from pi in PeopleInfos
    from person in pi.People
    select new {StartDate = pi.StartDate, Person = person }
  ).ToLookup(x => x.StartDate, x => x.Person);

OR

List<PeopleInfo> list =
  (
    from pi in PeopleInfos
    from person in pi.People
    group person by pi.StartDate into g
    select new PeopleInfo() { StartDate = g.Key, People = g.ToList() }
  ).ToList()
0

精彩评论

暂无评论...
验证码 换一张
取 消