LINQ中是否有类似于Python的enumerate函数?

5
在Python中,我可以轻松地在迭代时获取索引,例如:
>>> letters = ['a', 'b', 'c']
>>> [(char, i) for i, char in enumerate(letters)]
[('a', 0), ('b', 1), ('c', 2)]

我该如何使用linq实现类似的功能?
2个回答

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

在C# 7.0或更高版本中,您可以使用更少的代码来完成此操作:foreach (var (c, i) in letters.Select((c, i) => (c, i)))(使用“元组解构”) - Sjlver

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接