我有一个User对象列表(List<User>
)。此列表中的每个对象都有一个事件列表(List<Event>
)。我需要在每个用户的所有事件列表中创建一个新的事件集合,其中包含公共对象。我的意思是基本集合中的每个用户都有新事件集合中的每个事件。
我认为可以使用foreach循环完成,但我希望有更优雅的方法来使用LINQ。
希望,你会有所帮助。谢谢。
答案 0 :(得分:1)
您可以使用Enumerable.Interstect
和Enumerable.Aggregate
方法
// first get events for first user
IEnumerable<Event> seed = userList.First().Events;
// intersect with events for users (except the first)
var commonItems = userList.Skip(1).Aggregate(seed, (s, u) => s.Intersect(u.Events));
答案 1 :(得分:0)
我们的想法是选择所有用户中的所有事件,然后创建相等事件组,只选择那些事件数与用户数相同的组,然后为每个用户组选择一个事件。
var x = users.SelectMany(u => u.Events) // select all events at once
.GroupBy(e => e) // group them
.Where(g => g.Count() == users.Count) // select groups with as many events as users
.Select(g => g.Key); // select just one event for each group (the others are the same)