Linq - 将来自不同对象的子列表合并为单个对象

时间:2011-02-11 12:37:51

标签: c# linq

我有一个具有日期和人员列表的对象,一个人有名字和姓氏。类似的东西:

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

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

我有一个人员信息列表,其中有多个StartDates相同,每个人都有自己的人员列表。是否可以使用linq将它们合并为单个对象?

实施例

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

预期输出

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

这可以在linq中使用吗?

由于

2 个答案:

答案 0 :(得分:6)

你可以这样做:

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

但这看起来真像一个黑客;我建议你设计容器类,以防止这个“重复日期”场景首先发生。例如使用ILookup<DateTime, Person>进行相等的IDictionary<DateTime, List<Person>>HashSet<PeopleInfo>StartDate的实施。

答案 1 :(得分:1)

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