📅  最后修改于: 2023-12-03 15:30:50.565000             🧑  作者: Mango
在 C# 中,我们通常使用 foreach 循环来遍历集合类型的对象,例如数组、列表、字典等等。但是在某些情况下,我们可能需要访问当前集合项的索引,而不仅仅是其值。本文将介绍如何在 foreach 循环中访问索引。
首先,让我们来看一个基本的 foreach 循环:
string[] fruits = { "apple", "banana", "orange" };
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}
上面的代码会遍历 fruits 数组中的每个元素,并将其打印到控制台上。
要访问当前元素的索引,我们可以使用一个额外的变量来记录循环的次数。例如:
string[] fruits = { "apple", "banana", "orange" };
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(i + ": " + fruits[i]);
}
上面的代码会输出:
0: apple
1: banana
2: orange
这种做法是可行的,但如果集合非常大,这样的做法就显得有些笨拙。幸运的是,C# 中的 foreach 循环可以用于遍历任何实现了 IEnumerable 接口的类型,其中就包括数组和列表。而 IEnumerable 接口中定义了一个额外的方法 GetEnumerator(),我们可以用它来获得一个 IEnumerator 实例,该实例提供了一些额外的方法,包括访问当前元素的索引。
因此,我们可以这样来实现:
string[] fruits = { "apple", "banana", "orange" };
foreach (var pair in fruits.Select((Value, Index) => new { Value, Index }))
{
Console.WriteLine(pair.Index + ": " + pair.Value);
}
上面的代码用 LINQ 的 Select 方法将数组中的每个元素映射为一个包含其值和索引的匿名对象。然后,我们就可以在 foreach 循环中使用这个匿名对象,从而获得索引。
当然,这种做法比起前面的基本循环还是稍微有些繁琐(至少需要包含 using System.Linq
命名空间)。但是,这种做法的一个好处是,它在遍历所有 IEnumerable 类型的集合时都能使用,并且不会在性能上带来太大的影响。
在 C# 中,可以使用 foreach 循环和 LINQ 的 Select 方法来访问集合中元素的索引。尽管这种方法相对于基本循环有些复杂,但它适用于所有实现了 IEnumerable 接口的类型,并且不会带来太大的性能开销。