【发布时间】:2016-02-04 19:04:01
【问题描述】:
我最近遇到了几个案例,这让我想知道在使用 LINQ 时是否有任何方法可以获取内部索引,或者如果没有,可以有效地生成索引。
考虑以下情况:
List<int> list = new List() { 7, 4, 5, 1, 7, 8 };
在 C# 中,如果我们要使用 LINQ 返回上述数组中“7”的索引,我们不能简单地使用 IndexOf/LastIndexOf - 因为它只会返回第一个/最后一个结果。
这不起作用:
var result = list.Where(x => x == 7).Select(y => list.IndexOf(y));
不过,我们有几种解决方法。
例如,一种方法可能是这样(我通常这样做):
int index = 0;
var result = from x in list
let indexNow = index++
where x == 7
select indexNow;
它将通过使用let引入额外的参数indexNow。
还有另一种方式:
var result = Enumerable.Range(0, list.Count).Where(x => list.ElementAt(x) == 7);
它将使用 Enumerable.Range 生成另一组项目并从中挑选结果。
现在,我想知道是否有其他更简单的方法,例如:
- 如果有任何(内置)方法来获取 IEnumerable 的内部索引,而无需使用 let 或声明某些内容
- 使用 Enumerable.Range 以外的东西(可能是新的东西?我不太熟悉如何做到这一点)为 IEnumerable 生成索引,或者
- 任何其他可以缩短代码但仍能获得 IEnumerable 索引的东西。
【问题讨论】:
-
var result = list.Select((x, idx) => idx);其中 idx 是 IEnumerable 中每个元素的索引 - 如果我有误解,我们深表歉意。 -
@TVOHM 感谢您的评论,您很可能是对的......这是我迄今为止从未意识到的重载之一......
标签: c# indexing ienumerable