Пересечение пересечения является коммутативным и ассоциативным. Это означает, что (A ∩ B ∩ C) = (A ∩ (B ∩ C)) = ((A ∩ B) ∩ C), и изменение порядка списков не изменит результат. Так что просто примените .Intersect()
несколько раз:
var commonCats = List1.Intersect(List2).Intersect(List3).ToList();
Итак, чтобы сделать ваш код более общим:
var searchList = searchString.Split(' ');
// Change "int" if this is not the type of i.category.ID in the query below.
IEnumerable<int> result = null;
foreach (string word in searchList)
{
var query = from i in index
where i.word.ToUpper().Contains(word1)
select i.category.ID;
result = (result == null) ? query : result.Intersect(query);
}
if (result == null)
throw new InvalidOperationException("No words supplied.");
var commonCats = result.ToList();