在LINQ中有没有类似于Python的enumerate?

5 投票
2 回答
756 浏览
提问于 2025-04-15 18:51

在Python中,当我在循环中遍历列表时,可以很方便地获取到索引,比如:

>>> letters = ['a', 'b', 'c']
>>> [(char, i) for i, char in enumerate(letters)]
[('a', 0), ('b', 1), ('c', 2)]

那么我该如何在LINQ中做类似的事情呢?

2 个回答

5

你可以使用带有索引变量的 Enumerable.Select 方法来实现这个功能。这个方法让你可以访问每个元素的索引,也就是它在列表中的位置。你可以利用这个索引来生成一个新的匿名类型。下面的代码可以正常编译和运行:

static void Main()
{

    var letters = new char[] { 'a', 'b', 'c' };
    var results = letters.Select((l, i) => new { Letter = l, Index = i });

    foreach (var result in results)
    {
        Console.WriteLine("{0} / {1}", result.Letter, result.Index);
    }
    Console.ReadKey();
}
9

当然可以。有一个叫做 Enumerable.Select 的方法,它有一个重载版本,可以接受一个 Func<TSource, int, TResult> 作为参数,这样你就可以在处理元素的时候同时获取它的索引。

举个例子:

char[] letters = new[] { 'a', 'b', 'c' };
var enumerate = letters.Select((c, i) => new { Char = c, Index = i });
foreach (var result in enumerate) {
    Console.WriteLine(
        String.Format("Char = {0}, Index = {1}", result.Char, result.Index)
    );
}

输出结果:

Char = a, Index = 0
Char = b, Index = 1
Char = c, Index = 2

撰写回答