foreach
foreach
循环是C#中用于遍历数组、集合以及其他实现了 IEnumerable
接口的对象的一种简便方法。foreach
循环使得您可以轻松地迭代集合中的每个元素,而无需显式地管理索引或迭代器。下面详细介绍 foreach
循环的语法及其用法。
foreach 语法
foreach
循环的基本语法如下:
foreach (type element in collection)
{
// 对 element 执行的操作
}
其中:
type
:是集合中元素的类型。element
:是一个临时变量,代表集合中的当前元素。collection
:是要遍历的集合或数组。
使用示例
示例 1:遍历数组
假设我们有一个整数数组,我们想要打印出数组中的每个元素:
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
这段代码将会输出:
1
2
3
4
5
示例 2:遍历 List 集合
如果我们有一个 List<string>
集合,我们同样可以使用 foreach
循环来遍历它:
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
Console.WriteLine(name);
}
这段代码将会输出:
Alice
Bob
Charlie
foreach 的内部工作原理
在内部,foreach
循环实际上是通过调用集合的 GetEnumerator
方法来创建一个枚举器(enumerator),然后依次调用 MoveNext
方法前进到下一个元素,并使用 Current
属性来获取当前元素的值。当 MoveNext
返回 false
时,循环结束。
示例 3:手动使用枚举器
为了更好地理解 foreach
循环的工作原理,下面展示如何手动使用枚举器:
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
IEnumerator<string> enumerator = names.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
这段代码与使用 foreach
循环的效果相同,但它展示了底层的迭代过程。
foreach 的限制
虽然 foreach
循环提供了一个简洁的方式来遍历集合,但它也有一些限制:
- 不可修改集合:在
foreach
循环体内,您不能修改正在遍历的集合。例如,您不能添加或删除元素,否则会引发InvalidOperationException
。 - 无法访问索引:如果您需要访问当前元素的索引,
foreach
循环不如for
循环方便。在这种情况下,您可以使用List<T>.GetEnumerator()
并手动遍历,或者使用for
循环结合索引。
示例 4:访问索引
如果您确实需要访问索引,可以使用 for
循环:
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
for (int i = 0; i < names.Count; i++)
{
Console.WriteLine($"Element at index {i}: {names[i]}");
}
或者使用 LINQ 的 Enumerable.Range
方法结合 Select
:
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
for (int i = 0; i < names.Count; i++)
{
Console.WriteLine($"Element at index {i}: {names[i]}");
}
// 使用 LINQ
foreach (var item in names.Select((value, index) => new { Index = index, Value = value }))
{
Console.WriteLine($"Element at index {item.Index}: {item.Value}");
}
总结
foreach
循环是一种非常实用且易于使用的循环结构,适用于遍历数组或实现了 IEnumerable
接口的集合。它简化了代码,并使得遍历集合变得更加直观。然而,在需要修改集合或访问元素索引的情况下,您可能需要考虑使用其他的循环结构。