Если у меня есть IEnumerable, где ClassA выставляет свойство ID типа долго. Действительно ли возможно использовать запрос Linq для получения всех экземпляров ClassA с идентификатором, принадлежащим второму IEnumerable?
Другими словами, это может быть сделано?
IEnumerable<ClassA> = original.Intersect(idsToFind....)?
где исходный IEnumerable<ClassA>
и idsToFind IEnumerable<long>
.
Да.
Как ответили другие, вы можете использовать Где
, но это будет крайне неэффективно для больших наборов.
Если производительность вызывает беспокойство, вы можете вызвать Join
:
var results = original.Join(idsToFind, o => o.Id, id => id, (o, id) => o);
Если idsToFind
может содержать дубликаты, вам нужно будет вызвать Distinct ()
в идентификаторах или результатах или замените Join
на GroupJoin
(параметры GroupJoin будут такими же).
Используйте метод Where для фильтрации результатов:
var result = original.Where(o => idsToFind.Contains(o.ID));
Вы можете это сделать, но в текущей форме вы захотите использовать метод расширения Where
.
var results = original.Where(x => yourEnumerable.Contains(x.ID));
Intersect
, с другой стороны, найдет элементы, которые есть в обоих IEnumerable
. Если вы ищете только список идентификаторов, вы можете сделать следующее, которое использует преимущества Intersect
var ids = original.Select(x => x.ID).Intersect(yourEnumerable);
Простой способ:
IEnumerable<ClassA> result = original.Where(a => idsToFind.contains(a.ID));