2011-11-27 114 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();