回答
就想通了自己...
的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