лямбда-выражение для существует в списке - PullRequest
29 голосов
/ 05 июля 2010

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

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

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

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

int[] listofIds = GetListofIds();

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

Ответы [ 4 ]

54 голосов
/ 05 июля 2010

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

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

List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));
21 голосов
/ 05 июля 2010
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));
6 голосов
/ 05 июля 2010

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

list.Where(r => listofIds.Contains(r.Id))
1 голос
/ 05 июля 2010

Я бы посмотрел на оператор 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...