我如何计数元素直到找到N个好元素

本文关键字:元素 何计数 | 更新日期: 2023-09-27 18:15:59

我有一个集合

我想从它只投影前N个未删除的

但是我想计算有多少个元素(已删除和未删除)我遍历到第n个未删除元素。

我该怎么做?我想使用副作用:

int i;
collectiom.Skip(Convert.ToInt32(startIndex))
            .TakeWhile( x=> 
{
++i != 0; 
return (!x.IsDeleted)
})
            .Take(N);

但是编译器拒绝。现在我发现它并没有满足我的需要

TIA

我如何计数元素直到找到N个好元素

这个怎么样:

var selected = collection.Select((x, i) => new {Item = x, Index = i})
                         .Skip(Convert.ToInt32(startIndex))  
                         .Where(x => !x.Item.IsDeleted)
                         .Take(N);

结果是一个N匿名对象序列,其中x.Item为原始对象,x.Index为其在原始集合中的索引。如果您想开始计算startIndex的原始集合,只需交换SelectSkip调用。

你可以得到你想要的数字,像这样:

var numberProcessed = selected.Last().Index + 1;

一定要用linq吗?

这里有一个更理智的尝试:)

List<thing> result = new List<thing>();
collection.ToList().ForEach(x => {
   if (!x.IsDeleted && i < N){
      result.Add(x);
      i++;
   }
});

这个适合我:

        IEnumerable<Thing> result = collectiom.TakeWhile((x, index) => {
            if (numNonDeleted == N)
                return false;
            if (!x.Deleted && ++numNonDeleted == N)
                numIveBeenThrough = index + 1;
            return true;
        }).Where(x => !x.Deleted).ToList();