Lambda выражение существует в списке
Если я хочу отфильтровать список объектов по определенному id, я могу сделать это:
list.Where(r => r.Id == idToCompare);
Что делать, если вместо одного idToCompare
у меня есть список идентификаторов для сравнения с?
Каков синтаксис для сравнения с предопределенным списком? Что-то вроде:
int[] listofIds = GetListofIds();
list.Where(r => r.Id "in listofIds");
Ответы
Ответ 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);