2013-03-30 4 views
1

У меня есть список объектов пользователя (List<User>). Каждый объект в этом списке имеет список событий (List<Event>). Мне нужно создать новую коллекцию событий с общими объектами во всех списках событий для каждого пользователя. Я имею в виду, что каждый пользователь в базовой коллекции имеет каждое событие в новой коллекции событий.Как найти общие объекты в нескольких списках?

Я думаю, что это можно сделать с помощью цикла foreach, но я надеюсь, что это более элегантный способ сделать это с помощью LINQ.

Надеюсь, вы поможете. Спасибо.

+2

Трудно понять, о чем вы просите. Можете ли вы привести пример ожидаемого ввода и вывода? – StriplingWarrior

ответ

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)); 
+0

Спасибо большое! Но он говорит, что не может преобразовать Generic.IEnumerable в Generic.List по методу Intersect. Есть ли способ исправить это? s.Intersect (u.Events). ToList() в порядке? –

+0

@ АлексейЦветков-Омеличев На самом деле, вместо добавления '.ToList()' declare 'seed' как' IEnumerable '- оба работают, но второй вариант более эффективен. см. мой обновленный ответ. –

+0

Хорошо! Спасибо :) –

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) 
Смежные вопросы