Пересеките запрос LINQ

Если у меня есть IEnumerable, где ClassA выставляет свойство ID типа долго. Действительно ли возможно использовать запрос Linq для получения всех экземпляров ClassA с идентификатором, принадлежащим второму IEnumerable?

Другими словами, это может быть сделано?

IEnumerable<ClassA> = original.Intersect(idsToFind....)?

где исходный IEnumerable<ClassA> и idsToFind IEnumerable<long>.

48
задан abatishchev 18 November 2011 в 14:39
поделиться

4 ответа

Да.

Как ответили другие, вы можете использовать Где , но это будет крайне неэффективно для больших наборов.

Если производительность вызывает беспокойство, вы можете вызвать Join :

var results = original.Join(idsToFind, o => o.Id, id => id, (o, id) => o);

Если idsToFind может содержать дубликаты, вам нужно будет вызвать Distinct () в идентификаторах или результатах или замените Join на GroupJoin (параметры GroupJoin будут такими же).

56
ответ дан 26 November 2019 в 18:49
поделиться

Используйте метод Where для фильтрации результатов:

var result = original.Where(o => idsToFind.Contains(o.ID));
1
ответ дан 26 November 2019 в 18:49
поделиться

Вы можете это сделать, но в текущей форме вы захотите использовать метод расширения Where .

var results = original.Where(x => yourEnumerable.Contains(x.ID));

Intersect , с другой стороны, найдет элементы, которые есть в обоих IEnumerable . Если вы ищете только список идентификаторов, вы можете сделать следующее, которое использует преимущества Intersect

var ids = original.Select(x => x.ID).Intersect(yourEnumerable);
9
ответ дан 26 November 2019 в 18:49
поделиться

Простой способ:

IEnumerable<ClassA> result = original.Where(a => idsToFind.contains(a.ID));
5
ответ дан 26 November 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: