我有一个具有日期和人员列表的对象,一个人有名字和姓氏。类似的东西:
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中使用吗?
由于
答案 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()