Лямбда-выражение для получения индексов элементов списка условно

У меня есть 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

Вот как это происходит:

  1. Выберите source + its index
  2. Добавьте условие к предложению where (источник предложения where теперь содержит original source + index)
  3. Выберите index

var indexes = inputList.Select((input, index) => new { input, index }).Where(a => condition(a.input)).Select(a => a.index);