用于有条件地获取列表项索引的Lambda表达式

时间:2010-11-13 21:09:18

标签: c# lambda

我有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?

4 个答案:

答案 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)

这是怎么回事:

  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);