2013-04-22 3 views
3

Вот как мой код выглядитЯ хочу элементы из второго списка, который содержит все элементы из первого списка

List<Entity> lists = CacheManager.GetAllEntity(); 
List<long> firstLists = lists .Select <Entity,long>(x=>x.ID).ToList<long>(); 
List<Entity2> secondLists = CacheManager.GetAllEntity2(); 

где entity2 выглядит как:

public class Entity2 
{ 
    public long ID;  
    public long EntitytID; 
} 

Теперь предположим, что firstsLists содержит {1,2,3,4}. Второй один содержит

ID EntitytID 
1 1 
1 2 
1 3 
1 4 
2 1 
2 4 
3 1 
4 2 
5 4 

то мой вывод должен дать мне

ID EntitytID 
1 1 
1 2 
1 3 
1 4 

, поскольку идентификатор элемента 1 имеет все значения {1,2,3,4}.

+1

и что, если один из 1 не имеет одного из (1,2,3,4), скажем, 4-го. Каким должен быть ожидаемый результат? – Tigran

ответ

0

Как насчет:

var results = secondLists 
    .GroupBy(z => z.ID) 
    .Where(z => firstLists.All(z2 => z.Select(z3 => z3.EntitytID).Contains(z2))) 
    .SelectMany(z => z); 
0
var itemsGroupedById = SecondList.GroupBy(item => item.id, item => item).ToList(); 
var listToReturn = new List<Entity2>(); 
foreach(var group in itemsGroupedById) 
{ 
    var id = group.Key; 
    var entityIdsInThisGroup = group.Select(items => items.EntityId).ToList(); 
    var intersection = entityIdsInThisGroup.Intersect(FirstList).ToList(); 
    if(intersection.Count == FirstList.Count) 
    { 
     listToReturn.Add(group); 
    } 
} 
return listToReturn; 

Это будет делать следующее -

  1. Сгруппируйте все элементы в вашем втором списке по их идентификаторам.
  2. В каждой группе он будет пересекать список идентификаторов сущностей в этой группе и те, что указаны в вашей первой группе.
  3. Если на пересечении есть все элементы вашего первого списка, он добавит группу в список, который вы вернете.
Смежные вопросы