2011-11-27 91 views
3

我有一个集合。我如何计算元素直到找到N个好元素?

我想从中项目未删除的只是前N个。

但是我想统计有多少元素(删除和未删除) 我遍历,直到到达第N个非删除元素。

我该怎么办? 我想使用的副作用:

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

但是,编译拒绝。 现在我看到它没有回答我的需求呢

TIA

+0

你可以给输入数据和期望的结果的例子吗? – sll

+0

使用LINQ从来不是一个需求......不要使用错误的工具来完成你的工作(和代码)。 –

+0

@Ed S - 我同意你的观点,但在这种情况下,我认为Linq很好地解决了这个问题。 (我试图在不使用Linq的情况下解决这个问题,但是我的非linq解决方案并没有接近Andrew Cooper的答案的可读性)。 –

回答

5

如何:

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; 
+0

+1这绝对是一个'Where' /'Take'方案 - 这不是一个'TakeWhile' –

+0

这种阅读是第三次,我终于看到了多么辉煌,这是后。我希望我可以给你+2 –

+0

@Andrew - 仅仅是明确的,以满足OP的问题,采取前n项,但算你一共有多少项目必须通过到那里,你可以完全离开关'.Skip (Convert.ToInt32(的startIndex))'??? –

2

难道整个事情必须与LINQ?

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

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

你也可能需要类似'如果(I> N)休息;' –

+0

@Kirk - 感谢,固定 –

+0

@Kirk - 事实上,经过再三考虑,我不认为你可以把一个破发有 –

0

这个工作对我来说:

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