Если я хочу отфильтровать список объектов против определенного идентификатора, я могу сделать это:
list.Where(r => r.Id == idToCompare);
Что, если, вместо сингла idToCompare
, У меня есть список Ids для сравнения с?
Каков синтаксис для сравнения против предопределенного списка? Что-то как:
int[] listofIds = GetListofIds();
list.Where(r => r.Id "in listofIds");
Если listOfIds
- список, это будет работать, но List.Contains() - это линейный поиск, так что это не очень эффективно.
Лучше хранить идентификаторы, которые вы хотите найти, в контейнере, подходящем для поиска, например, в Set.
List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));
Вы можете использовать метод расширения Contains():
list.Where(r => listofIds.Contains(r.Id))
Я бы посмотрел на оператор соединения:
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);
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));