лямбда-выражение для существует в рамках списка

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

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

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

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

int[] listofIds = GetListofIds();

list.Where(r => r.Id "in listofIds");   
30
задан burnttoast11 12 February 2016 в 18:06
поделиться

4 ответа

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

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

List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));
55
ответ дан 27 November 2019 в 23:16
поделиться

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

list.Where(r => listofIds.Contains(r.Id))
6
ответ дан 27 November 2019 в 23:16
поделиться

Я бы посмотрел на оператор соединения:

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);
1
ответ дан 27 November 2019 в 23:16
поделиться
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));
21
ответ дан 27 November 2019 в 23:16
поделиться
Другие вопросы по тегам:

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