Лямбда-выражение для получения индексов элементов списка условно
У меня есть List<bool>
. Мне нужно получить индексы верхних n элементов, где item value = true.
Например, следующие элементы списка (bool)
10011001000
TopTrueIndexes(3) = The first 3 indexes where bits are true are 0, 3, 4
TopTrueIndexes(4) = The first 4 indexes where bits are true are 0, 3, 4, 7
Как я могу написать лямбда для этого?
Ответы
Ответ 1
Хорошо, если у вас есть какое-то легко идентифицируемое условие, вы можете сделать что-то вроде этого, которое будет работать для любого IEnumerable<T>
:
var query = source.Select((value, index) => new { value, index })
.Where(x => x.value => Condition(value))
.Select(x => x.index)
.Take(n);
(Очевидно, заполните соответствующий бит предложения Where
. Если это просто List<bool>
, это может быть только x => x.value
.)
Важными битами являются то, что вы используете перегрузку Select
, чтобы получить пары index/value перед Where
, а затем еще один Select
, чтобы получить только индексы после Where
... и использовать Take
, чтобы получить только первые n
результаты.
Ответ 2
Там есть перегрузка Select
, где лямбда получает два параметра: индекс и элемент. Таким образом, вы можете просто взять индексы, в которых значение истинно, снабжая дозорный (здесь -1) для тех, которые вы не хотите. Затем отфильтруйте часовые и возьмите сколько хотите:
bool[] bools = ...;
var indices = bools.Select((val, ix) => val ? ix : -1).Where(i => i >= 0).Take(n);
Ответ 3
Это должно, вероятно, сделать это.
IEnumerable<bool> GetItemsInList(IEnumerable<bool> list, int count) {
int ind = 0;
return list.Select(itm => new {i = ind++, v = itm}).Where(itm => itm.v).Take(count).Select(itm => itm.i);
}
Ответ 4
Вот как это происходит:
- Выберите
source + its index
- Добавьте условие к предложению
where
(источник предложения where теперь содержит original source + index
) - Выберите
index
var indexes = inputList.Select((input, index) => new { input, index }).Where(a => condition(a.input)).Select(a => a.index);