回答
就想通了自己...
的IEnumerable<T>.Where()
方法有一個重載,是以當前元素的索引 - 醫生給你開。
(new []{1,2,3,4,5}).Where((elem, idx) => idx % 2 == 0);
這將返回
{1, 3, 5}
更新:爲了掩飾我的兩個用例和丹道的建議,我們也可以指定返回的第一個元素應該是什麼:
var firstIdx = 1;
var takeEvery = 2;
var list = new []{1,2,3,4,5};
var newList = list
.Skip(firstIdx)
.Where((elem, idx) => idx % takeEvery == 0);
...將返回
{2, 4}
public static IEnumerable<T> Sample<T>(this IEnumerable<T> source, int interval)
{
// null check, out of range check go here
return source.Where((value, index) => (index + 1) % interval == 0);
}
用法:
var upToTen = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = upToTen.Sample(2);
var multiplesOfThree = upToTen.Sample(3);
你也可以跳過數組並使用'Enumerable.Range(1,10)'。 – 2010-08-25 17:34:18
@Anthony:這只是一個例子,用於立即理解。我知道一些開發人員必須查找'Enumerable.Range'。 – 2010-08-25 18:27:31
雖然不是LINQ你還可以與yield
創建一個擴展方法。
public static IEnumerable<T> EverySecondObject<T>(this IEnumerable<T> list)
{
using (var enumerator = list.GetEnumerator())
{
while (true)
{
if (!enumerator.MoveNext())
yield break;
if (enumerator.MoveNext())
yield return enumerator.Current;
else
yield break;
}
}
}
用''使用'把它包起來! ('IEnumerable'繼承'IDisposable'。) – 2010-08-25 19:01:03
@Dan:你的意思是IEnumerator。我以前從未意識到這一點? <挖掘一些舊代碼/> – 2010-08-25 19:19:40
是的,我的意思是'IEnumerator'。哎呦! (出於某種原因,我總是輸入其中一個,意思是輸入另一個。必須是肌肉記憶。) – 2010-08-25 19:26:59
- 1. 爲列表中的每個第五個對象做些什麼
- 2. 每對中的第二個對象必須是非零
- 3. Angular Filter - 返回第二個數組中每個對象的對象?
- 4. 列表中的每個第二個div的CSS樣式
- 5. 計劃,讓每一個第5和第7的每個對象的唯一列表(列表)從一個數組
- 6. Scala - 將列表中的每個第二個元素加倍
- 7. 遍歷python中每個嵌套列表的第二個值
- 8. Haskell函數交換列表中的每個第二個元素
- 9. 如何創建一個父對象列表,其中每個父對象可以有一個子對象列表?
- 10. 序言:顛倒列表中的每個第二個列表元素
- 11. 在第二個表中將N列中的值乘以N列?
- 12. 如何從列表對象中的屬性從一個到第二個動作
- 13. 去除Corona中的第一個第二個對象Lua
- 14. 從列表中選擇隨機對象,不存在於第二個列表
- 15. 需要將第一個對象的字段複製到第二個對象中
- 16. 查找第二個列表中的一個列表的第一個實例
- 17. 按方案中對的第二個元素對排序列表
- 18. 如何得到第一個列表對象使用第二列表對象導致Django模板
- 19. 將列表中的每第二個元素替換爲其他列表中的每三個元素。
- 20. PHP:在一個MySQL表的每個記錄,從第二個表
- 21. 訪問列表中的第一個對象列表
- 22. 列表形式的列表中的每個第n個元素
- 23. 每個第二個中繼器循環
- 24. PHP:1個變量中的2個對象。試圖獲得第二個對象
- 25. MySQL從第二個表中只選擇一行,對於第一個表中的每個ID
- 26. wxpython +在第二個對象列表視圖中追蹤objectlistview中的選擇
- 27. 基於第一個列表循環第二個列表
- 28. 讓第二個表中對象ID是唯一的
- 29. 使用Underscore.js從列表中返回每個第二項?
- 30. 選擇4列網格中的每個第二個和第三個元素
我第一次看到索引在集合謂詞bravo中非常穩定的用法,我不會想到這件事。 – 2010-08-25 16:21:56
你可以定義一個擴展方法,它返回this.Where(...)使你的應用程序本身更清晰。 – Douglas 2010-08-25 16:22:27
我可能會建議使用'idx + 1'來匹配「每N個元素」的描述;至少對我來說,這表明返回的第一個元素應該是第N個元素。因此'{1,2,3,4,5}' - to * me * - 中的每個第二個元素表示'{2,4}'(您的代碼返回'{1,3,5}')。不過,也許這是主觀的。 – 2010-08-25 16:23:13