Cri*_*scu 7 .net c# linq linq-to-objects
我有一个IEnumerable,我希望得到一个包含每个第n个元素的新IEnumerable.
这可以在Linq完成吗?
Cri*_*scu 23
我自己搞清楚了......
该IEnumerable<T>.Where()方法具有一个过载,它接受当前元素的索引 - 正是医生所要求的.
(new []{1,2,3,4,5}).Where((elem, idx) => idx % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
这会回来
{1, 3, 5}
Run Code Online (Sandbox Code Playgroud)
更新:为了涵盖我的用例和Dan Tao的建议,我们还要指定第一个返回的元素应该是什么:
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);
Run Code Online (Sandbox Code Playgroud)
......会回来
{2, 4}
Run Code Online (Sandbox Code Playgroud)
实施Cristi的建议:
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);
}
Run Code Online (Sandbox Code Playgroud)
用法:
var upToTen = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = upToTen.Sample(2);
var multiplesOfThree = upToTen.Sample(3);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2952 次 |
| 最近记录: |