2013-03-30 3 views
1

사용자 개체 목록 (List<User>)이 있습니다. 이 목록의 모든 개체에는 이벤트 목록 (List<Event>)이 있습니다. 모든 사용자의 모든 이벤트 목록에 공통 개체가 포함 된 새로운 이벤트 컬렉션을 만들어야합니다. 나는 기본 컬렉션의 모든 사용자가 새로운 이벤트 컬렉션에 모든 이벤트를 가지고 있음을 의미합니다.여러 목록에서 공통 개체를 찾는 방법은 무엇입니까?

foreach 루프를 사용하여 수행 할 수 있다고 생각하지만, LINQ를 사용하여이 작업을 수행하는보다 우아한 방법이 있기를 바랍니다.

희망, 도움을 드리겠습니다. 고맙습니다.

+2

당신이 무엇을 요구하는지 이해하기가 어렵습니다. 예상되는 입출력의 예를 들려 줄 수 있습니까? – StriplingWarrior

답변

1

당신은 Enumerable.InterstectEnumerable.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으로 변환 할 수 없다고합니다. Intersect 메서드에 나열하십시오. 그것을 고칠 방법이 있습니까? s.Intersect (u.Events) .ToList()는 괜찮습니까? –

+0

@ АлексейЦветков-Омеличев 실제로'.ToList()'를 추가하는 대신에'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) 
관련 문제