我有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
我怎么能为此写一个lambda?
答案 0 :(得分:33)
好吧,假设你有一些容易识别的条件,你可以做这样的事情,这对任何 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
的重载来获取 Where
之前的索引/值对,然后使用另一个Select
来获取在 Where
之后的索引...并使用Take
仅获得第一个n
结果。
答案 1 :(得分:2)
有Select
的重载,其中lambda有两个参数:索引和元素。所以你可以只取值为true的索引,为你不想要的那些提供一个sentinel(这里是-1)。然后过滤掉哨兵并取出你想要的数量:
bool[] bools = ...;
var indices = bools.Select((val, ix) => val ? ix : -1).Where(i => i >= 0).Take(n);
答案 2 :(得分:0)
这应该可以做到。
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);
}
答案 3 :(得分:-1)
这是怎么回事:
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);