Подтвердить что ты не робот

Lambda выражение существует в списке

Если я хочу отфильтровать список объектов по определенному id, я могу сделать это:

list.Where(r => r.Id == idToCompare);   

Что делать, если вместо одного idToCompare у меня есть список идентификаторов для сравнения с?

Каков синтаксис для сравнения с предопределенным списком? Что-то вроде:

int[] listofIds = GetListofIds();

list.Where(r => r.Id "in listofIds");   
4b9b3361

Ответ 1

Если listOfIds - это список, это будет работать, но List.Contains() - это линейный поиск, поэтому это не очень эффективно.

Вам лучше хранить идентификаторы, которые вы хотите найти в контейнере, который подходит для поиска, например Set.

List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));

Ответ 2

var query = list.Where(r => listofIds.Any(id => id == r.Id));

Другой подход, полезный, если массив listOfIds велик:

HashSet<int> hash = new HashSet<int>(listofIds);
var query = list.Where(r => hash.Contains(r.Id));

Ответ 3

Вы можете использовать метод расширения Contains():

list.Where(r => listofIds.Contains(r.Id))

Ответ 4

Я бы посмотрел на оператор Join:

from r in list join i in listofIds on r.Id equals i select r

Я не уверен, как это будет оптимизировано по методам Contains, но, по крайней мере, дает компилятору лучшее представление о том, что вы пытаетесь сделать. Это также значительно ближе к тому, что вы пытаетесь достичь.

Изменить: Синтаксис метода расширения для полноты (теперь, когда я это выяснил):

var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r);